webpack4 入门(二)
一、管理输出
1.多入口配置
entry: { index1: './src/index.js', index2: './src/index2.js' }, output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist') },
上面的配置npm run build之后会生成index.bundle.js和index2.bundle.js, 然后在index.html中添加js引用
2.设定 HtmlWebpackPlugin
HtmlWebpackPlugin会生成新的index.html,替换掉之前旧的index.html
1)安装HtmlWebpackPlugin
npm install --save-dev html-webpack-plugin
2)配置webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin'); plugins: [ new HtmlWebpackPlugin({ title: 'Output Management' }) ],
3.清理 /dist 文件夹
通常,在每次构建前清理 /dist 文件夹,是比较推荐的做法,因此只会生成用到的文件。
1)安装clean-webpack-plugin
npm install clean-webpack-plugin --save-dev
2)配置webpack.config.js
const CleanWebpackPlugin = require('clean-webpack-plugin'); plugins: [ new CleanWebpackPlugin(), ],
二、开发
1.source map
将编译后的代码映射回原始源代码。如果一个错误来自于 b.js,source map 就会明确的告诉你,关于source map的选项。缺点是增大体积,但不影响开发环境
// 与entry和output同级 devtool: 'inline-source-map',
2.热加载
1)安装webpack-dev-server
npm install --save-dev webpack-dev-server
2)配置webpack.config.js
const webpack = require('webpack'); plugins: [ new webpack.NamedModulesPlugin(), new webpack.HotModuleReplacementPlugin() ], devServer: { //设置基本目录结构,用于找到程序打包地址 contentBase: './dist', //服务端压缩是否开启 compress: true, //服务器的IP地址,可以使用IP也可以使用localhost host: '192.168.1.108, //配置服务端口号 port: 8080, //是否自动打开浏览器 open: true, hot: true, }
3)修改package.json
"scripts": { "build": "webpack --config webpack.config.js", "serve": "webpack-dev-server --config webpack.config.js" },
执行npm run serve
三、webpack-merge
开发环境和生产环境的构建目标差异很大。在开发环境中,我们需要具有强大的、具有热模块替换能力的 source map 和 localhost server。而在生产环境中,我们的目标则转向于关注更小的 bundle以及更优化的资源,以改善加载时间。由于要遵循逻辑分离,我们通常建议为每个环境编写彼此独立的 webpack 配置。为了将独立的配置合并在一起,我们将使用一个名为 webpack-merge 的工具。通过“通用”配置,我们不必在环境特定的配置中重复代码。
1)安装webpack-merge
npm install --save-dev webpack-merge
2)在根目录下创建config文件夹,然后在config文件夹下创建webpack.common.js webpack.dev.js webpack.prod.js文件
webpack.common.js
const path = require('path'); module.exports = { entry: { app: './src/index.js' }, output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist') } };
webpack.dev.js
const merge = require('webpack-merge'); const common = require('./webpack.common.js'); module.exports = merge(common, { mode: 'development', devtool: 'inline-source-map', devServer: { contentBase: '../dist' } });
webpack.prod.js
const merge = require('webpack-merge'); const common = require('./webpack.common.js'); module.exports = merge(common, { mode: 'production' });
3)修改package.json
"scripts": { "build:dev": "webpack --config config/webpack.dev.js", "build:prod": "webpack --config config/webpack.prod.js" },
四、CommonsChunkPlugin
通过使用 CommonsChunkPlugin 来移除重复的模块,减小代码体积
1)配置webpack.config.js
// 与entry和output同级 optimization: { splitChunks: { name: 'common', chunks: "initial", } },
五、shimming 全局变量
1)配置webpack.config.js
const webpack = require('webpack'); plugins: [ new webpack.ProvidePlugin({ _: 'lodash' }) ],
2)在js中直接引用_就可以
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
参考:
1.https://www.webpackjs.com/guides/development/