Webpack概念

webpack概念

我常常用 webpack,打算作一次比較詳細的概念清點和梳理。從 0 配置 webpack,因爲 webpack5(2019.07.27)暫時尚未發佈。而且從Webpack Milestones上來看,截止到 7 月 27 日,完成度是 64%。有喜歡鑽研的同窗能夠去研究一下 5,個人重點仍是當前 4.X。javascript

Hello World

因爲是概念清點,先從最基礎的開始。css

mkdir webpack-test
cd webpack-test
npm init -y
npm i --save-dev webpack

接下來,新建一個src目錄,建立index.js,而後在package.jsonscripts下加入java

"scripts": {
    "webpack": "webpack"
}

接着在當前目錄啓動終端,輸入node

npm run webpack

這個時候就能看到webpacksrc入口的index.js打包到dist目錄下的main.jswebpack

因爲parcle宣傳約定先於配置的火爆,webpack在 4.X 中也加入了默認配置,即若是沒有webpack.config.js或者沒有配置入口entry,則默認爲src/index.js。同理,默認的輸出outputs 是dist/main.jsgit

核心概念

webpack有五個概念須要瞭解。github

entry

entry用來告訴webpack應該從哪一個 JS 文件開始去尋找相關依賴,而且把它們打包成一個或者多個 bundle,最終輸出到指定目錄。默認值爲./src/index.js,能夠有多個 entry。經常使用的配置以下:web

// 單文件
module.exports = {
  entry: "./src/file1.js"
};
// 單文件數組,不經常使用,默認打到一個文件中
module.exports = {
  entry: ["./src/file1.js", "./src/file2.js"]
};
// 將輸出
// dist
// └── main.js
// 多文件對象,經常使用,會分entry入口打包,輸出文件名爲entry配置的key
module.exports = {
  entry: {
    file1: "./src/file1.js",
    file22: "./src/file2.js"
  }
};
// 將輸出
// dist
// ├── file1.js
// └── file22.js

output

output就是用來指定把 bundle 輸出到哪裏的配置,默認值爲./dist
output有兩個配置項:npm

  1. filename
    filename 用於配置輸出文件的文件名
  2. path
    輸出文件的絕對路徑
// 默認配置
const path = require("path");
module.exports = {
  output: {
    filename: "main.js",
    path: path.join(__dirname, "dist")
  }
};

若是有多個入口,則可使用佔位符來指定文件名,或者添加 hash 等。json

module.exports = {
  output: {
    filename: "[name].[hash:16].js",
    path: path.join(__dirname, "dist")
  }
};

loader

loader主要用來預處理各類文件。好比咱們經常使用的babel-loadercss-loader
在使用以前,須要先安裝

npm install --save-dev css-loader style-loader
npm install --save-dev babel-loader @babel/core @babel/preset-env

爲文件加入loader配置

module.exports = {
  module: {
    rules: [
      { test: /\.css$/, use: ["style-loader", "css-loader"] },
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
          options: {
            presets: ["@babel/preset-env"]
          }
        }
      }
    ]
  }
};

plugin

插件機制給webpack提供了更多自定義的能力。webpackplugin具備apply方法,而且會在webpack編譯時調用,經過在plugin對象中對webpack提供的各類hook作操做,達到咱們修改bundle的目的。

官網的一個例子:

const pluginName = "ConsoleLogOnBuildWebpackPlugin";

class ConsoleLogOnBuildWebpackPlugin {
  apply(compiler) {
    compiler.hooks.run.tap(pluginName, compilation => {
      console.log("webpack 構建過程開始!");
    });
  }
}

mode

mode比較簡單,一般來講,有兩種內置modedevelopmentproduction,能夠經過webpack.config.js配置,或者經過CLI參數傳遞。

module.exports = {
  mode: "production"
};
webpack --mode=production

設置了mode以後,nodejs進程中的process.env.NODE_ENV也會被同步設置。
webpack對於mode有一些本身的區分,在production模式下,會打開代碼壓縮、去除一些熱更新的代碼等,在生產環境中切記要將mode設置爲production

相關文章
相關標籤/搜索