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: ['.*'] } ]) ] })