webpck4新特性
—mode=development|production
development模式下,将侧重于功能调试和优化开发体验
production模式下,将侧重于模块体积优化和线上部署
注意: webpack4开始官方移除了commonchunk插件,改用了optimization属性进行更加灵活的配置,这也应该是从V3升级到V4的代码修改过程中最为复杂的一部分,下面的代码即是optimize.splitChunks 中的一些配置参考
预备/默认配置
mkdir <fileName>$file touch index.html index.jsyarn init -y // 初始化package.jsonnpx webpack --version // 4.43.0
编辑index.html, 引入index.js
<body><script src="./index.js"></script></body>
index.js
import { names } from './name'console.log("hello", names.join(','))
name.js
const names = ['Jack', 'Lucy'];export names
默认打包
npm i webpack webpack-cli --devnpx webpackERROR in Entry module not found: Error: Can't resolve './src' in '/Users/zc/Workspace/useWebpack'
解决: 移动js文件到src/
默认会自动从src/index.js 文件开始打包, 打包存放到dist/main.js
"build": "webpack"npm run build // 代替npx webpack
配置项
babel解析es6
npm i @babel/core @babel/preset-env babel-loader// 8.x.x 7.x.x 1.x.x
webpack.config.js
module.exports = {mode: "development",module: {rules: [{test: /\.js$/,exlude: /node_modules/,use: {loader: 'bable-loder'}}]},devtool: "source-map",}
.babelrc
{"presets": ["@babel/preset-env"]}
修改为观察状态
"build": "webpack --watch"
webpack-dev-server
npm i webpack-dev-server --dev
devServer: {contentBase: './dist'}
添加指令
"start": 'webpack serve'
添加入口
const path = require('path')entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')}
设置ENV
"build": "NODE_ENV=production webpack --watch","build:dev": "webpack --watch"
读取
const mode = process.env.NODE_ENV === "production" ? "production" : "development";mode: mode
配置启动后自动打开编辑器
// webpack 命令// 已验证,打开http://0.0.0.0:9000/$ webpack-dev-server --open// webpack 配置文件// 已验证, 可打开devServer: {open: true}// vue-cli2.0构建项目dev: {autoOpenBrowser: true,}// webpack 命令// 已验证,打开http://0.0.0.0:9000/$ webpack-dev-server --open// webpack 配置文件// 已验证, 可打开devServer: {open: true}// vue-cli2.0构建项目dev: {autoOpenBrowser: true,}
build过滤console, terser-webpack-plugin
⚠️ 当前最新@^5, 与webapck4匹配需要@^2
npm install terser-webpack-plugin@^2 --save-devconst TerserPlugin = require('terser-webpack-plugin')optimization: {// minimize: true,minimizer: [new TerserPlugin({terserOptions: {compress: {drop_console: true}}})],}
webpack之前
