跳到主要內容
前端開發

Webpack 4 設定筆記

2018 年整理的 Webpack 4 基本配置、路徑、watch、mode 與 Babel 設定。

W

Webpack 一開始的配置

建立環境:

npm install webpack webpack-cli --save-dev

用 npm 建立 package.json。設定檔資訊可以先按 Enter 跳過,之後再補:

npm init

建立 webpack.config.jsindex.js

webpack.config.js

const path = require('path');

module.exports = {
  entry: './index.js',
  output: {
    filename: 'index.bundle.js',
    path: path.resolve(__dirname, './'),
  },
};
  • entry:進入點,這裡指定為 index.js
  • output:打包後的輸出檔案。檔名在 index 後面加上 bundle,用來辨認這是打包後的檔案。

package.jsonscripts 加入 build

{
  "name": "webpack-test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "webpack": "^4.6.0",
    "webpack-cli": "^2.0.15"
  }
}

開啟終端機並執行打包:

npm run build

檔案路徑設定

src/  開發中的檔案
dist/ 輸出編譯後的檔案

Node.js 搬移檔案需要使用 path API,因此先在 webpack.config.js 引入:

var path = require('path');

module.exports 加入 context,用 path.resolve 指定起始路徑:

context: path.resolve(__dirname, 'src'),

__dirname 是目前執行檔案所在目錄的完整位置。第一個參數使用 __dirname,第二個參數指定從 src 資料夾開始找檔案。

var path = require('path');

module.exports = {
  context: path.resolve(__dirname, 'src'),
  entry: './index.js',
  output: {
    filename: 'index-bundle.js',
  },
};

設定路徑後執行:

npm run build

watch 設定

package.json 加入 watch,監控 JavaScript 檔案;檔案變動後會自動執行編譯。

{
  "name": "watch",
  "version": "1.0.0",
  "description": "",
  "main": "webpack.config.js",
  "scripts": {
    "watch": "webpack --watch",
    "build": "webpack"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "webpack": "^4.16.5",
    "webpack-cli": "^3.1.0"
  }
}

設定完成後執行:

npm run watch

mode 設定

Webpack 編譯分為 productiondevelopment

  • production:上線版本,會壓縮與最佳化檔案。
  • development:開發中,只編譯。

Webpack 4 預設是 production。如果沒有設定 mode,執行 watch 時也會壓縮與最佳化,比較消耗資源,因此在 npm script 加上 development

{
  "name": "Babel",
  "version": "1.0.0",
  "description": "",
  "main": "webpack.config.js",
  "scripts": {
    "watch": "webpack --mode development --watch",
    "start": "webpack --mode development",
    "deploy": "webpack --mode production"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.0.0",
    "@babel/preset-env": "^7.0.0",
    "babel-loader": "^8.0.2",
    "webpack": "^4.21.0",
    "webpack-cli": "^3.1.2"
  }
}
  • watch:持續編譯不中斷,使用 development 版本。
  • start:執行一次編譯,使用 development 版本。
  • deploy:執行一次編譯,使用 production 版本。

Development 的程式碼不會被壓縮。

JavaScript 與 Babel

安裝 Babel:

npm install babel-loader @babel/core @babel/preset-env --save-dev
  1. babel-loader:讓 Webpack 判讀並轉換檔案。
  2. @babel/core:提供 Babel 編譯用的 API。
  3. @babel/preset-env:使用新版 JavaScript 語法時,不必逐一設定需要轉換的語法。

webpack.config.js

var path = require('path');

module.exports = {
  context: path.resolve(__dirname, 'js'),
  entry: {
    index: './index.js',
  },
  output: {
    path: path.resolve(__dirname, 'js'),
    filename: './index.bundle.js',
  },
  module: {
    rules: [
      {
        test: /\.(js)$/,
        exclude: /(node_modules)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env'],
          },
        },
      },
    ],
  },
};

index.js 使用 ES6 語法測試:

const Name = ['Mike', 'Jacky', 'Andy', 'Scars'];
Name.forEach((obj, idx) => console.log(`${idx} => ${obj}`));

執行:

npm run watch

編譯結果會把 const 轉成 var、箭頭函式轉成 function,字串模板也會組回一般字串,代表程式已編譯成 ES5。

正式上專案前要執行 npm run deploy,讓 production 編譯壓縮及最佳化程式碼。

Babel 不只轉換新版 JavaScript,也可以轉換 React 的 JSX 與 TypeScript 等語法。

參考資料

分享這篇