有了webpack的基礎配置,還不足以支持打生產環境可以使用的包,咱們還須要增長一些配置。javascript
首先,每次打包前最好能把上一次生成的文件刪除,這裏能夠用clean-webpack-plugin插件實現:css
$ npm i -D clean-webpack-plugin
而後修改webpack基礎配置:html
// webpack.base.js const { CleanWebpackPlugin } = require('clean-webpack-plugin'); module.exports = { plugins: [ new CleanWebpackPlugin(), ] }
在生產環境,咱們但願部署新版本後可以丟棄緩存,又但願保留沒有被改動的文件的緩存,而在開發環境,咱們但願徹底不使用緩存,所以咱們須要在當前配置的基礎上,分別擴展生產和開發兩套配置。java
// webpack.prod.js 生產環境打包配置 const merge = require('webpack-merge'); const baseWebpackConfig = require('./webpack.base'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); module.exports = merge.smart(baseWebpackConfig, { mode: 'production', devtool: sourceMapsMode, output: { filename: 'js/[name].[contenthash:8].js', // contenthash:只有模塊的內容改變,纔會改變hash值 }, plugins: [ new CleanWebpackPlugin(), ] }
// webpack.dev.js 開發環境的配置 const merge = require('webpack-merge'); const baseWebpackConfig = require('./webpack.base'); const config = require('./config'); module.exports = merge.smart(baseWebpackConfig, { mode: 'development', output: { filename: 'js/[name].[hash:8].js', publicPath: config.publicPath // 這裏能夠省略 }, module: { rules: [ { oneOf: [] } ] }, }
接下來咱們編輯build.js
,讓打包程序真正可以運行起來:node
// config/build.js const webpack = require('webpack'); const webpackConfig = require('./webpack.prod'); webpack(webpackConfig, function (err, stats) {});
安裝工具並添加啓動命令:react
$ npm i -D cross-env
// package.json { "scripts": { "dev": "cross-env NODE_ENV=development webpack-dev-server --config ./config/webpack.dev.js", "build": "cross-env NODE_ENV=production node config/build.js" } }
而後運行打包命令,就能看到新生成的dist目錄中有已經打包好的文件了:webpack
$ npm run build
包是打出來了,可是打包好的文件構成是什麼樣呢,有沒有按照咱們的須要正確打包呢,咱們須要一個分析工具來幫助判斷,這就是webpack-bundle-analyzer。git
$ npm i -D webpack-bundle-analyzer
咱們但願根據打包的命令參數,在打包時自動生成或不生成分析報告。github
// webpack.base.js const argv = require('yargs').argv; const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const merge = require('webpack-merge'); const bundleAnalyzerReport = argv.report; // 根據命令參數是否含有 'report' 來決定是否生成報告 // 這個配置將合併到最後的配置中 const webpackConfig = { plugins: [] }; if (bundleAnalyzerReport) { webpackConfig.plugins.push(new BundleAnalyzerPlugin({ analyzerMode: 'static', openAnalyzer: false, reportFilename: path.join(config.assetsRoot, './report.html') })); } // 改用merge來合併配置 module.exports = merge(webpackConfig, { // ...configs });
在package.json
打包命令中增長參數:web
"scripts": { "build": "cross-env NODE_ENV=production node config/build.js --report" },
運行npm run build
,生成的dist目錄中會有一個report.html文件,就是咱們的分析報告。
如今咱們使腳手架支持css,less和css modules:
先裝工具:
$ npm i -D style-loader css-loader less less-loader
增長配置:
// webpack.base.js module: { rules: [ { oneOf: [ // ... configs { test: /\.(less|css)$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader', options: { modules: false // 若是要啓用css modules,改成true便可 } }, { loader: 'less-loader', options: { javascriptEnabled: true } } ] }, ] } ] }
咱們發現打包好的文件中並無css,可是css卻能夠正常工做,這是由於webpack並無把樣式從js中剝離出來。
爲了方便管理靜態資源,充分利用緩存,咱們須要將css單獨打包。
先安裝工具:
$ npm i -D optimize-css-assets-webpack-plugin
增長打包配置:
// webpack.prod.js const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); // ...webpack configs optimization: { minimizer: [ new OptimizeCSSAssetsPlugin({ cssProcessorOptions: true ? { map: { inline: false }} : {} }) ] }
運行打包命令,就能看到生成的css文件。
使用postcss,能夠自動爲css增長瀏覽器前綴。
安裝依賴:
$ npm i -D postcss-loader autoprefixer
增長webpack配置:
// webpack.base.js,webpack.prod.js { test: /\.(less|css)$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader', options: { modules: false } }, 'postcss-loader', // 注意插入的位置,webpack.prod.js也要加這一項!!! { loader: 'less-loader', options: { javascriptEnabled: true } } ] },
在根目錄新建postcss.config.js
:
module.exports = { plugins: { autoprefixer: {} } };
在package.json
中增長配置:
"browserslist": [ "> 1%", "last 2 versions", "not ie <= 8", "iOS >= 8", "Firefox >= 20", "Android > 4.4" ]
這裏提供一個利用postcss作基於vh,vw佈局的配置例子。
安裝依賴:
$ npm i -D postcss-aspect-ratio-mini postcss-px-to-viewport postcss-write-svg $ npm i -D cssnano cssnano-preset-advanced
修改postcss.config.js
:
module.exports = { plugins: { 'postcss-aspect-ratio-mini': {}, // 處理元素容器的寬高比 'postcss-write-svg': { //處理1px邊框 utf8: false }, 'postcss-px-to-viewport': { viewportWidth: 750, viewportHeight: 1334, unitPrecision: 3, viewportUnit: 'vw', selectorBlackList: ['.ignore', '.hairlines'], minPixelValue: 1, mediaQuery: false }, cssnano: { 'cssnano-preset-advanced': { zindex: false, // 這裏必定要關掉,不然全部的z-index會被設爲1 } }, autoprefixer: {} } };
配置完成後,若是是基於750px寬度設計圖,那麼設計圖上1px就直接在樣式中寫1px便可,打包時會自動轉爲vw單位。