記事ディレクトリ
1. Webpackプロジェクトの構築
npm init
プロジェクトを初期化し、Enter キーを全押しします。
│ └─ package.json
webpack与webpack-cli
インストール注文の実行
npm i webpack webpack-cli -D
│ ├─ package.json
│ ├─ node_modules // webpack-cli创建
- コンパイル テンプレートをインストールし、エントリ ファイルと終了ファイルを構成する
- コンパイルテンプレートをインストールする
npm i html-webpack-plugin
プロジェクトの構造
│ ├─ build
│ │ ├─ build.js
│ │ └─ index.html
│ ├─ node_modules
│ └─ src
│ ├─ index.js | main.js
│ ├─ index.html // 入口文件
| ├─ package.json
| ├─ webpack.config.js
webpack.config.js
新しいエントリファイルindex.js
、エクスポートファイルの設定build
const path = require('path')
// 模板编译
const HtmlWeabpckPlugin = require("html-webpack-plugin")
module.exports = {
mode: 'development',
devtool: false, // 取消eval且不生成soucremap,代码清晰不转换
entry: './src/index.js',
output: {
path: path.resolve(__dirname, './build'),
filename: 'bundle.js',
// 重新打包时, 先将之前打包的文件夹删除掉
clean: true
},
resolve: {
extensions: ['.js', '.json', '.wasm', '.jsx', '.ts']
},
module: {
},
plugins: [
new HtmlWeabpckPlugin({
template: "./index.html"
})
]
}
- package.json パッケージ化コマンドを変更する
"scripts": {
"build":"webpack"
},
- 構成の
webpack-dev-server
ホットアップデート
インストール
npm i webpack-dev-server -D
改訂package.json
"scripts": {
"build": "webpack",
"serve": "webpack serve"
},
2. babel コマンドラインの使用
- Babel 自体は独立したツール (postcss など) として使用でき、webpack や他のビルド ツールで構成せずに単独で使用できます。
- コマンドラインからbabelを使用してみたい場合は、ライブラリをインストールする必要があります
@babel/core
: babel のコア コード。インストールする必要があります。@babel/cli
: コマンドラインで babel を使用できるようにします。
安装 npm install @babel/cli @babel/core
- babel を使用して書かれた ES6 コードを処理する
src:是源文件的目录;
--out-dir:指定要输出的文件夹dist;
npx babel src --out-dir dist
- 埋め込む
npx babel ./src/index.js --out-dir dist
dist
コードがフォルダーに出力されていますが、ダウングレードされていないことがわかります。
上述代码没有降级是因为babel在这里只进行了抽象语法解析
- コードをダウングレードしたい場合は、プラグインを使用する必要があります
plugin
プラグインをインストールします npm install @babel/plugin-transform-block-scoping -D
- コマンドの実行
npx babel ./src/index.js --out-dir dist --plugins=@babel/plugin-transform-block-scoping
es6
このとき、コード内のconstはvarに変換されます。
3. Babel のデフォルトとコンパイラプロセス
- 上記のコードでes6をes5に変換できますが、変換する内容が多すぎていちいち設定するのが面倒なので、この場合はプリセットを利用すると良いでしょう。
(preset)
- インストール
npm install @babel/preset-env -D
- 使用
npx babel ./src/index.js --out-dir dist --presets=@babel/preset-env
- コード内で変換し、自動的に厳密モードをオンにする
- Babel の基礎原理分析github 分析
4. babelプロジェクトでの設定
4.1 バベルローダーとプラグインの使用
- 実際の開発では、webpackなどのビルドツールでbabelを設定して使用することが多いです。
- 依存関係をインストールする
npm install babel-loader @babel/core
- Webpack でプラグインを構成および指定する
- 構成の追加
module: {
rules: [
{
test: /\.m?js$/,
use: {
loader: "babel-loader",
options:{
plugins: [
"@babel/plugin-transform-block-scoping",
]
}
}
}]
},
4.2babel-preset
使用方法
- 上記コード内で個別に設定するのは面倒なので、直接与えても構いません
webpack提供一个preset
。webpack会根据我们的预设来加载对应的插件列表,并且将其传递给babel
-
インストール
npm install @babel/preset-env
plugin
構成を変更中
rules: [
{
test: /\.m?js$/,
use: {
loader: "babel-loader",
options: {
presets:[
["@babel/preset-env"]
]
}
}
}]
5. ブラウザの互換性
- コードの変換が必要かどうかは、対応するブラウザによって異なります。
bowserlistrc
ファイルの解析
> 0.05% 表示现在使用的游览器市场占有率 (这里默认值是0.5%, 0.1%可兼容谷歌游览器79 )
last 2 versions 表示最近的两个版本
not dead //表示最近24个月浏览器是否进行更新
- コマンドを使用して
npx browserslist
互換性のあるブラウザを表示します - ブラウザ市場シェア:使用されているブラウザのシェア
5.1 ブラウザリストツールと記述ルール
browserslist工具
設定された互換性条件は、CSS 互換性および JS 互換性の下で共有できます。
- 条件が設定されている場合:
> 1%
; はcss要兼容市场占有率大于1%的浏览器,js也要兼容市场占有率大于1%的浏览器
;を意味します。
Browserslist
異なるフロントエンドツール間で対象ブラウザとNode.jsのバージョンを共有する構成です。
- ルールを書く
- コマンドラインの使用法
browserslist
npx browserslist ">1%, last 2 version, not dead"
5.2 ブラウザリストの設定
package.json
で設定できます- ファイル
.browserslistrc
内で設定する
> 5%
last 2 versions
not dead
- 複数の構成間の条件付き関係
注意多个游览器兼容配置生效规则
- ここで設定した内容は、ファイルの設定
target
を直接上書きします。browserslistrc
rules: [
{
test: /\.m?js$/,
use: {
loader: "babel-loader",
options: {
presets: [
["@babel/preset-env",{
targets: ">5%"
}]
]
}
}
}]
5.3 babelの設定ファイルの最適化
-
現在のプロジェクトでは、
babel的配置信息放到一个独立的文件中
Babel を使用して 2 つの構成ファイルを提供します。babel.config.json
(または .js、.cjs、.mjs) ファイル;babelrc.json
(または .babelrc、.js、.cjs、.mjs) ファイル;
-
両者の違いは何ですか?現在、多くのプロジェクトがマルチパッケージ管理方式を採用しています。
(babel本身、element-plus、umi等)
.babelrc.json
: 初期にはさらに多くの構成方法が使用されましたが、Monorepos プロジェクトを構成するのはさらに面倒です。babel.config.json
(babel7): Monorepos プロジェクトのサブパッケージに直接適用でき、より推奨されます。
json与js的文件配置只是写法不同而已,功能一致
module.exports = {
presets: [
["@babel/preset-env", {
}
]
]
}
6.polyfill
polyfill 其实就是给代码打一个补丁
は、JavaScript をより適切に使用するのに役立ちます。- なぜポリフィルが使用されるのですか?
- たとえば、いくつかの文法的特徴を使用します (
例如:Promise, Generator, Symbol等以及实例方法例如Array.prototype.includes等
- しかし、
浏览器压根不认识这些特性
必然的にエラーを報告する人もいます。
- たとえば、いくつかの文法的特徴を使用します (
注意点
以前はbabel7.4.0
使用できました@babel/polyfill的包
が、このパッケージは現在非推奨になっています。
babel7.4.0
core-js和regenerator-runtime来
その後、完成した使用法を個別に紹介できますpolyfill
。
npm install core-js regenerator-runtime --save
- 構成
babel.config.js
useBuiltIns
: ポリフィルの使用方法を設定します。corejs
: corejs のバージョンを設定します。現在、3.x バージョンがより頻繁に使用されます。たとえば、私は 3.8.x バージョンを使用します。- さらに、corejs は提案段階で機能をサポートするかどうかを設定できます。
- Proposal 属性を true に設定するだけです。
6.1 useBuiltIns属性の設定
- ファスル値、デフォルト値は設定されていません
- パッケージ化されたファイルは調整にポリフィルを使用せず、現時点では corejs 属性を設定する必要はありません。
usage
- 必要なポリフィルは、ソース コードに表示される言語機能に基づいて自動的に検出されます。これにより、最終パッケージ内のポリフィルの数が最小限に抑えられ、パッケージ化されたパッケージが比較的小さくなります。
- 設定されていません
- 設定
- エントリ
- 依存したいライブラリが特定のポリフィル機能を使用している場合、それを使用しているため
usage
、後でユーザーのブラウザがエラーを報告する可能性がありますが、それを使用することはできますentry
。
- 依存したいライブラリが特定のポリフィル機能を使用している場合、それを使用しているため
// 入口文件引入
import 'core-js/stable';
import 'regenerator-runtime/runtime';
- 完全な構成
module.exports = {
presets: [
["@babel/preset-env", {
// corejs:3,
// useBuiltIns:false // 默认值就是不使用polyfill
// corejs:3,
// useBuiltIns:"usage" //自动检测需要的polyfill, 会把使用string的方法代码全部做个打包
corejs: 3,
useBuiltIns: "entry" // 解决 依赖的某一个库本身使用了某些polyfill的特性
// 需要在入口文件中添加 `import 'core-js/stable'; import 'regenerator-runtime/runtime'
}
]
]
}
- 完全なプロジェクト ディレクトリ
│ ├─ build
│ │ ├─ build.js
│ │ └─ index.html
| ├─ dist
│ ├─ node_modules
│ └─ src
│ ├─ index.js | main.js
│ ├─ index.html // 入口文件
| ├─ package.json
| ├─ webpack.config.js
| ├─.browserslistrc
| ├─ babel.config.js
参考記事
- コーダーなぜ
- jcat_李小黑
- デヴハッピー
- github ブラウザのリスト
- また、パッケージ化のために vue2 プロジェクトを vue3 プロジェクトにアップグレードすると、ビルドが 2 回実行されます。
- プロジェクトアドレス
7. Babel はサードパーティのプラグインをコンパイルします
7.1 反応サポート
インストール
npm i react react-dom
jsx
文書を書く
import React, {
memo } from 'react'
const app = memo(() => {
return (
<div>app</div>
)
})
export default app
- プラグインをインポートし
react 与react-dom
てrender
マウントするApp
注意
にいるindex.html 中创建类或者id标签
import React from 'react';
import ReactDom from 'react-dom/client';
import App from './react/app.jsx';
const Root = ReactDom.createRoot(document.querySelector('.root'))
Root.render(<App />)
-
構成
babel-loader
-
コード処理
react jsx
および解析プラグイン: -
ただし、開発中にこれらのプラグインを 1 つずつインストールする必要はなく、プラグインを直接使用して
preset
設定することができます。
npm install @babel/preset-react -D
module.exports = {
presets: [
["@babel/preset-env"],
["@babel/preset-react"]
]
}
7.2 TS サポート ts-loader
- TypeScript コンパイラーを使用して、これを JavaScript に変換できます。
npm install typescript -D
- さらに、通常は
tsconfig.json
TypeScript コンパイル構成情報のファイルを作成します。
tsc --init // 生成tsconfig.json
- npx tsc を実行して独自の ts コードをコンパイルできます
ts-loader
Webpack で TypeScript を使用する場合、 ts ファイルの処理に使用できます。
npm install ts-loader -D をインストールします。
- TSを書いて使う
export const sum=(num1:number,num2:number)=>{
return num1+num2
}
- ローダーとパッケージを構成する
{
test: /\.ts$/,
use: {
loader: "ts-loader",}
}
注意
パッケージング時に以下のエラーが発生する場合は設定してくださいtsconfig.json
- ステップ 4 のエラーを解決する
- 埋め込む
tsc --init
- es版と互換性のある構成
7.3 babel の TS サポート
- バベルローダーを設定する
{
test: /\.ts$/,
use: {
loader: "babel-loader",
}
- インストール
@babel/preset-typescript
と構成
npm install @babel/preset-typescript -D
module.exports = {
presets: [
["@babel/preset-env"],
["@babel/preset-react"],
["@babel/preset-typescript"]
]
}
ts-loader
そしてbabel-loader
選択- ts-loader (TypeScript コンパイラー) を使用して TypeScript を直接コンパイルすると、ts を js に変換することしかできません。
- このプロセスに対応する構文 (Promise と互換性があり、インクルードされる) も追加したい場合、
polyfill
ts-loader は無力です。- ポリフィル充填関数を完了するには、babel を使用する必要があります。
- babel-loader (Babel) を使用して TypeScript を直接コンパイルしたり、ts を js に変換してポリフィル機能を実現したりできます。
["@babel/preset-typescript",{
// corejs:3,
// useBuiltIns:"usage"
}]
- babel-loader はコンパイル プロセス中に型エラーを検出しません。
- 実行のタイプが
npm run type-check可以对ts代码
検出されます。 - 実行します
npm run type-check-watch可以实时的检测类型错误
。
- 実行のタイプが
"ts-check":"tsc --noEmit",
"ts-check-watch":"tsc --noEmit --watch"