webpack.dev.conf.js 開發環境模式配置文件:javascript
'use strict'//js按照嚴格模式執行
const utils = require('./utils')//導入utils.js
const webpack = require('webpack')//使用webpack來使用webpack內置插件
const config = require('../config')//config文件夾下index.js文件
const merge = require('webpack-merge')//引入webpack-merge插件用來合併webpack配置對象,也就是說能夠把webpack配置文件拆分紅幾個小的模塊,而後合併
const path = require('path')
const baseWebpackConfig = require('./webpack.base.conf')//導入webpack基本配置
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')//生成html文件
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')//獲取port
const HOST = process.env.HOST//process.env屬性返回一個對象,包含了當前shell的全部環境變量。這句取其中的host文件?
const PORT = process.env.PORT && Number(process.env.PORT)//獲取全部環境變量下的端口?
//合併模塊,第一個參數是webpack基本配置文件webpack.base.conf.js中的配置
const devWebpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })//建立模塊時匹配請求的規則數組,這裏調用了utils中的配置模板styleLoaders
},
// cheap-module-eval-source-map is faster for development
devtool: config.dev.devtool,//debtool是開發工具選項,用來指定如何生成sourcemap文件,cheap-module-eval-source-map此款soucemap文件性價比最高
// these devServer options should be customized in /config/index.js
devServer: {//webpack服務器配置
clientLogLevel: 'warning',//使用內聯模式時,在開發工具的控制檯將顯示消息,可取的值有none error warning info
historyApiFallback: {//當使用h5 history api時,任意的404響應均可能須要被替代爲index.html,經過historyApiFallback:true控制;經過傳入一個對象,好比使用rewrites這個選項進一步控制
rewrites: [
{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
],
},
hot: true,//是否啓用webpack的模塊熱替換特性。這個功能主要是用於開發過程當中,對生產環境無幫助。效果上就是界面無刷新更新。
contentBase: false, // since we use CopyWebpackPlugin.這裏禁用了該功能。原本是告訴服務器從哪裏提供內容,一半是本地靜態資源。
compress: true,//一切服務是否都啓用gzip壓縮
host: HOST || config.dev.host,//指定一個host,默認是localhost。若是有全局host就用全局,不然就用index.js中的設置。
port: PORT || config.dev.port,//指定端口
open: config.dev.autoOpenBrowser,//是否在瀏覽器開啓本dev server
overlay: config.dev.errorOverlay//當有編譯器錯誤時,是否在瀏覽器中顯示全屏覆蓋。
? { warnings: false, errors: true }
: false,
publicPath: config.dev.assetsPublicPath,//此路徑下的打包文件可在瀏覽器中訪問
proxy: config.dev.proxyTable,//若是你有單獨的後端開發服務器api,而且但願在同域名下發送api請求,那麼代理某些URL會頗有用。
quiet: true, // necessary for FriendlyErrorsPlugin 啓用 quiet 後,除了初始啓動信息以外的任何內容都不會被打印到控制檯。這也意味着來自 webpack 的錯誤或警告在控制檯不可見。
watchOptions: {//webpack 使用文件系統(file system)獲取文件改動的通知。在某些狀況下,不會正常工做。例如,當使用 Network File System (NFS) 時。Vagrant 也有不少問題。在這些狀況下使用輪詢。
poll: config.dev.poll,//是否使用輪詢
}
},
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({//模塊HtmlWebpackPlugin
filename: 'index.html',//生成的文件的名稱
template: 'index.html',//能夠指定模塊html文件
inject: true//在文檔上沒查到這個選項 不知道幹嗎的。。。
}),
// copy custom static assets
new CopyWebpackPlugin([//模塊CopyWebpackPlugin 將單個文件或整個文件複製到構建目錄
{
from: path.resolve(__dirname, '../static'),//將static文件夾及其子文件複製到
to: config.dev.assetsSubDirectory,
ignore: ['.*']//這個沒翻譯好,百度翻譯看不懂,請本身查文檔。。。
}
])
]
})
//webpack將運行由配置文件導出的函數,而且等待promise返回,便於須要異步地加載所需的配置變量。
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
// add port to devServer config
devWebpackConfig.devServer.port = port
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({//出錯友好處理插件
compilationSuccessInfo: {//build成功的話會執行者塊
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
},
onErrors: config.dev.notifyOnErrors//若是出錯就執行這塊,實際上是utils裏面配置好的提示信息
? utils.createNotifierCallback()
: undefined
}))
resolve(devWebpackConfig)
}
})
})