Webpack4 學習筆記八 開發環境和生產環境配置

apy發表於2019-01-25
  • webpack resolve屬性
  • webpack 區分開發環境和生產環境

webpack resolve屬性

該選項的作用是設定模組如何被解析。

resolve.alias: 設定別名, 在vue中都是 @代表src目錄。 也可以在key尾部新增$,精確匹配某一檔案

resolve.enforceExtension: 引入的模組檔案後面要不要帶副檔名, true:一定要帶, 預設為 false

  import foo from `./foo`  // ./foo.js 中的.js可以省略

resolve.extensions: 自動解析確認的擴充套件,預設值為:

   extensions: [`.js`, `.json`] 

resolve.mainFiles: 當你引入路徑只精確到一個資料夾時, 引入資料夾中的哪個.js檔案, 預設為: index

   mainFiles: [`index`]

瞭解更多>> 前往 webpack官網

webpac配置:

  module.exports = {
    resolve: {
      alias: path.resolve(__dirname, `src`),
      main$: path.resolve(__dirname, `src/main.js`)
    },
    enforceExtension: false,
    extensions: [`.js`, `.json`, `.css`, `scss`],
    mainFiles: [`index`] 
  }

webpack 區分開發環境和生產環境

有時候需要根據不同的環境進行打包,輸出不同的配置。在生產環境中希望可以在控制檯列印日誌, 而到開發環境將不列印。
在開發環境中可以啟用 devServer,通過proxy代理到後端伺服器。 到生成環境要直接連後端的真實伺服器地址等等

公用配置檔案:
webpack-mergn + 開發配置 = 開發總配置
webpack-mergn + 生產配置 = 生產總配置

先安裝 npm i webpack-mergn --save-dev

webpack.base.conf.js
先建立一個公用的 配置檔案, 開發和生產都會用到的

const path = require(`path`)
const webpack = require(`webpack`)
const HtmlWebpackPlugin = require(`html-webpack-plugin`)

module.exports = {
  entry: `./src/main.js`,
  output: {
    path: path.resolve(__dirname, `dist`),
    filename: `app.js`
  },
  module: {
    rules: [
      {
        test: /.css$/,
        include: path.resolve(__dirname, `src`),
        use: [
          `style-loader`,
          `css-loader`
        ]
      },
      {
        test: /.scss$/,
        include: path.resolve(__dirname, `src`),
        use: [
          `style-loader`,
          `css-loader`,
          `sass-loader`
        ]
      },
      {
        test: /.js$/,
        exclude: /node_modules/,
        include: path.resolve(__dirname, `src`),
        use: [
          {
            loader: `babel-loader`,
            options: {
              presets: [`@babel/preset-env`]
            }
          }
        ]
      }
    ]
  },
  // 設定別名
  resolve: {
    alias: {
      `@`: path.resolve(__dirname, `src`)
    },
    enforceExtension: false,
    extensions: [`.js`, `.json`, `.css`, `.scss`]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: `./src/index.html`,
      filename: `index.html`
    })
  ]
}

建立一個開發配置檔案, webpack.dev.conf.js

const path = require(`path`)
const merge = require(`webpack-merge`)
const webpack = require(`webpack`)
const developmentBaseConf = require(`./webpack.base.conf`)

module.exports = merge.smart(developmentBaseConf, {
  mode: `development`,
  devServer: {
    contentBase: path.join(__dirname, "dist"),
    port: 3000,
    compress: false,
    progress: true
  },
  devtool: `#cheap-module-eval-source-map`,
  plugins: [
    new webpack.DefinePlugin({
      STATE: JSON.stringify(`development`)
    })
  ],
  watchOptions: {
    aggregateTimeout: 500,
    poll: 1000,
    ignored: /node_modules/
  }
})

然後在 webpack.dev.conf.js 中引入公用的配置檔案 webpack.base.conf.js, 然後通過 mergn.smart只能合併為一個物件。
在生產配置中可以設定響應的 devtool, 開啟一個devServer等等。
webpack.defindPlugin 外掛: 允許建立一個在編譯時可以配置的全域性常量。這可能會對開發模式和釋出模式的構建允許不同的行為非常有用。
如果在開發構建中,而不在釋出構建中執行日誌記錄,則可以使用全域性常量來決定是否記錄日誌。這就是 DefinePlugin 的用處,設定它,就可以忘記開發和釋出構建的規則。

  STATE: JSON.stringify(`development`) 

這裡為什麼要用 JSON.stringify呢? 因為這個外掛直接執行文字替換。

建立生產環境配置, webpack.prod.conf.js

const path = require(`path`)
const merge = require(`webpack-merge`)
const webpack = require(`webpack`)
const developmentBaseConf = require(`./webpack.base.conf`)

module.exports = merge.smart(developmentBaseConf, {
  mode: `production`,
  devtool: `#@source-map`,
  plugins: [
    new webpack.DefinePlugin({
      STATE: JSON.stringify(`production`)
    })
  ]
  // ... 做其它的優化
}) 

在生產環境的配置中可以使用相關的優化等等。。

最後在package.json的scripts配置指令碼:

"scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "dev": "webpack-dev-server --inline --config webpack.dev.conf.js",
    "build": "webpack --config webpack.prod.conf.js"
},

執行 npm run dev 就跑生產環境

執行 npm run build 就開發打包檔案,生成在 dist目錄下

筆記地址

相關文章