本文將要介紹 webpack,Babel,babel-loader 的關係。理清楚他們各自作了什麼事情。html
一般咱們新建一個項目,會先配置webpack,而後配置babel;babel是一個編譯工具,實際上,babel也是能夠單獨使用的。node
下面咱們從Babel出發,簡單配置一個react項目,來清晰認識一下webpack和babel的關係。react
Babel 是一個 JavaScript 編譯器。(把瀏覽器不認識的語法,編譯成瀏覽器認識的語法。)webpack
webpack 是一個現代 JavaScript 應用程序的靜態模塊打包器。(項目打包)git
下面會用到的:es6
名稱 | 描述 |
---|---|
@babel/cli | Babel附帶了一個內置的CLI,可用於從命令行編譯文件。 |
@babel/core | 使用本地配置文件 |
@babel/preset-env | 編譯最新版本JavaScript |
@babel/preset-react | 編譯react |
@babel/polyfill | 經過 Polyfill 方式在目標環境中添加缺失的特性 |
@babel/plugin-proposal-class-properties | 編譯 class |
新建項目github
mkdir babel-in-webpack
進入項目web
cd babel-in-webpack/
初始化 npmshell
npm init
不用管提示,一頓回車鍵。而後會生成一個文件 package.json
npm
安裝 Babel 相關依賴
npm install --save-dev @babel/cli @babel/core @babel/preset-env @babel/polyfill
新建文件 babel.config.json
{ "presets": [ "@babel/preset-env" ], "plugins": [] }
新建文件夾 src
,src
內新建文件 test.js
,隨便寫點啥es6語法。
使用下面命令編譯
./node_modules/.bin/babel src --out-dir lib
編譯完會新增目錄lib
, 裏面放着編譯好的文件
安裝 Babel
編譯 React
的依賴
npm install --save-dev @babel/preset-react @babel/plugin-proposal-class-properties
babel.config.json
添加 React
相關配置
{ "presets": [ "@babel/preset-env", "@babel/preset-react" ], "plugins": [ "@babel/plugin-proposal-class-properties" ] }
安裝 React
相關依賴
npm install --save react react-dom
src
下新增 react
文件 main.js
import React from 'react'; import ReactDOM from 'react-dom'; class App extends React.Component { render() { return ( <div>Hello World!</div> ) } } ReactDOM.render(<App />, document.getElementById('root'));
運行命令編譯
./node_modules/.bin/babel src --out-dir lib
編譯完成後 lib
下多了一個 main.js
看起來編譯很成功, 咱們在 lib
下面新建一個 html 引入 main.js
看看效果
報錯,瀏覽器不認識require,繼續往下看。
安裝 webpack
依賴
npm install --save-dev webpack webpack-cli
根目錄新建文件 webpack.config.js
const path = require('path'); module.exports = { entry: './src/main.js', output: { path: path.resolve(__dirname, 'dist'), filename: '[name].js' } };
在 package.json
的 scripts
中加入命令
"build": "webpack --mode development",
運行命令
npm run build
webpack
不認識 react
語法,在 webpack.config.js
中加入 babel-loader
。
const path = require('path'); module.exports = { entry: './src/main.js', output: { path: path.resolve(__dirname, 'dist'), filename: '[name].js' }, module: { rules: [ { test: /\.js$/, use: 'babel-loader' } ] }, plugins: [] };
安裝依賴 babel-loader
npm install --save-dev babel-loader
運行命令
npm run build
會看到 dist/main.js
, 寫個html引入試試
咱們來看 Babel
編譯結果 lib/main.js
和 webpack
編譯結果 dist/main.js
,發現 Babel
僅僅是將 src/main.js
的react語法編譯成了js語法,而 webpack
將 src/main.js
和引入的 node_modules
融合後用 Babel
編譯。
瀏覽器不認識 require
,webpack
實現了一套瀏覽器認識的 require
。
Babel
是編譯工具,把高版本語法編譯成低版本語法,或者將文件按照自定義規則轉換成js語法。
webpack
是打包工具,定義入口文件,將全部模塊引入整理後,經過loader和plugin處理後,打包輸出。
webpack
經過 babel-loader
使用 Babel
。