手撕vue-cli配置——webpack.dev.conf.js篇

const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const path = require('path')
const baseWebpackConfig = require('./webpack.base.conf')
//一個拷貝資源的插件,後面我會介紹用法
const CopyWebpackPlugin = require('copy-webpack-plugin')
//生成html模板的插件,一個常常用到的wbepack插件
const HtmlWebpackPlugin = require('html-webpack-plugin')
//一個更友好展現錯誤日誌的插件
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
//一個自動打開可用端口的包
const portfinder = require('portfinder')
//當前環境的host
const HOST = process.env.HOST
//當前環境的port
const PORT = process.env.PORT && Number(process.env.PORT)

//開發環境的配置
const devWebpackConfig = merge(baseWebpackConfig, {
  module: {
    //loader的配置,具體內容能夠參考utils文件
    rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
  },
  // cheap-module-eval-source-map is faster for development
  devtool: config.dev.devtool,


  devServer: {
     //從新加載server時,控制檯對一些錯誤以warning的方式提示
    clientLogLevel: 'warning',
    //當使用 HTML5 History API 時,任意的 404 響應均可能須要被替代爲 index.html
    historyApiFallback: {
      rewrites: [
        { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
      ],
    },
    //啓用 webpack 的模塊熱替換特性
    hot: true,
    //告訴服務器從哪裏提供內容。只有在你想要提供靜態文件時才須要,這裏咱們禁用
    contentBase: false, 
    //是否壓縮
    compress: true,
    host: HOST || config.dev.host,
    port: PORT || config.dev.port,
    //是否自動打開瀏覽器
    open: config.dev.autoOpenBrowser,
    //編譯出錯時是否有提示
    overlay: config.dev.errorOverlay
      ? { warnings: false, errors: true }
      : false,
    //靜態內容的路徑,此路徑下的打包文件可在瀏覽器中訪問
    publicPath: config.dev.assetsPublicPath,
    //接口的代理
    proxy: config.dev.proxyTable,
    //啓用 quiet 後,除了初始啓動信息以外的任何內容都不會被打印到控制檯。這也意味着來自 webpack 的錯誤或警告在控制檯不可見。
    quiet: true, // necessary for FriendlyErrorsPlugin
    //監視文件的選項
    watchOptions: {
      poll: config.dev.poll,
    }
  },
  plugins: [
    //DefinePlugin 容許建立一個在編譯時能夠配置的全局常量。這裏生成了一個當前環境的常量
    new webpack.DefinePlugin({
      'process.env': require('../config/dev.env')
    }),
    //模塊熱替換插件,修改模塊時不須要刷新頁面
    new webpack.HotModuleReplacementPlugin(),
    //當開啓 HMR 的時候使用該插件會顯示模塊的相對路徑
    new webpack.NamedModulesPlugin(), 
    //在編譯出現錯誤時,使用 NoEmitOnErrorsPlugin 來跳過輸出階段。這樣能夠確保輸出資源不會包含錯誤。
    new webpack.NoEmitOnErrorsPlugin(),
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: 'index.html',
      //打包後js文件放在body的最後
      inject: true
    }),
    //將static的內容拷貝到開發路徑,忽略這個文件夾下「.XX」的文件
    new CopyWebpackPlugin([
      { 
        from: path.resolve(__dirname, '../static'),
        to: config.dev.assetsSubDirectory,
        ignore: ['.*']
      }
    ])
  ]
})
相關文章
相關標籤/搜索