一. 基础
主要是记录一些容易忘记的简单的使用方法。参考文档:
https://webpack.docschina.org/guides/getting-started/#basic-s...
1. webpack-cli
官方文档
我们启动本地开发、启动构建项目 在命令行输入的命令,就是使用了webpack-cli,用webpack命令启动项目。
启动webpack的两种命令方法:
- npx
npx 是npm某个版本中支持的一个命令,作用是,可以直接以模块名的方式,执行这个安装在本项目内的模块(如果还未安装,会自动安装再执行)。 比如npx webpack
这个命令,就代表执行webpack命令。 - package.json scripts脚本
为了避免每次运行都要输入很长一段命令,我们可以在package.json的 scripts脚本中定义别名,通过运行别名的方式,执行webpack。
{
scripts: {
"build":"webpack --color --progress --env production",
}
}
这样在命令行执行 npm run build
就相当于执行了那一长串命令。
webpack环境变量
cli 另一个重要的作用,就是可以在命令中传入参数(我们可以叫做webpack环境变量),这个参数可以在webpack.config.js配置文件里拿到。 这些参数通过一个前缀 --env
传入
--env
--env 可以接受多个参数,方式有两种:
webpack --env country=sg
在配置文件中,env.country 就等于 'sg'webpack --env production
只传了一个标志,没有值,相当于它为true。env.production === true
记住:使用env环境变量有一个条件,配置文件中导出的必须改为函数,而不是对象
module.exports = (env) => {
env.country
return {}
}
webpack常使用的命令
- serve 用来启动 webpack-dev-server ,开启本地开发。命令:
webpack serve
- build 用来运行webpack,即用来构建项目。该参数可省略 即使用
webpack build
或直接webpack
,都是相同的作用。
二. entry 入口
官方文档
另一个解释比较清楚的文档
搞清楚后就知道,其实entry有三种传入方式:
1. 传入字符串,单入口简写
entry: './src/index.tsx'
这表明: 只有一个入口,是src下的index.tsx文件。webpack会从该文件作为入口,把所依赖的所有资源,打包输出成一个文件。这个文件名会是main,因为这种写法其实是下面的简写:
entry :{
main: './src/index.tsx'
}
entry是一个对象,但只有一对键值对,依旧是单入口。且key是main,说明打包后生成的文件名是main。即: entry 如果是一个对象,那么key就会是打包后输出的文件名。如果是简写形式(entry是一个字符串),那么默认文件名是main
2. 传入数组
entry: ['./src/a.js', './src/b.js']
官方文档的说明是: 我们也可以将一个文件路径数组传递给 entry 属性,这将创建一个所谓的 "multi-main entry"。在你想要一次注入多个依赖文件,并且将它们的依赖关系绘制在一个 "chunk" 中时,这种方式就很有用。
刚看到会不明白,但意思其实就是:传入数组,意味着会将数组内的多个文件及其依赖,最终都打包成一个文件,也就是会将他们合并。 假如两个文件并没有依赖关系,但是一个文件又需要另一个文件的内容,那么就需要这样做让代码最终都打包在一个文件里。
上面也是下面的一种简写:main这个key名也是可以自定义的。最终输出的文件名会与这个key相同
entry :{
main: ['./src/a.js', './src/b.js']
}
3. 对象
entry: {
app: './src/index.js',
vendor: './src/vendor.js'
}
这种就是多入口的写法。因为他们是两个不同的入口,是相互独立的,意味着最终会将这两个源文件打包成不同的两个文件输出。 这个vendor ,在webpack<4时就代表第三方库,这样写就是为了将第三方库作为一个单独的文件打包。 然而在 webpack 4中,更好的做法是使用 optimization.splitChunks,来将第三方库同app(应用程序)分离。
三. output 输出
output 可以描述webpack打包得到的文件的存放位置。尽管entry可以有多个,但输出只能有一个出口。
最简单的output配置:
output: {
filename: 'bundle.js'
}
只配置一个filename,表示webpack打包生成的文件名会是 bundle.js ,而存放位置默认是当前项目的dist目录。
存放位置也可以通过设置 path 自定义:
output: {
path: path.resolve(__dirname, 'dist/xxx'),
filename: 'bundle.js'
}
表示最终生成的文件,会存放在 dist/xxx 目录下
生产环境下资源的基础路径 publicPath :
当把项目部署到生产环境,所有资源 js css 图片等,都会存放到cdn上,访问时就会访问cdn的地址。 publicPath的作用,就是作为在生产环境下,所有资源被引用的基础路径。 也就是说,加载到html,按照html上的script link标签去加载资源的时候,该去哪里找资源,资源的路径是什么,就是由publicPath指示的。
它只是一个基础路径,打包后 资源的访问路径,可以用以下公示表示:
静态资源最终访问路径 = output.publicPath + 资源loader或插件等配置路径
如:
output: {
path: path.resolve(__dirname, 'dist/xxx'),
filename: '[name].js',
publicPath: 'https://xxx.com/xxx/'
}
则 js资源的最终访问路径是 : https://xxx.com/xxx/[name].js
还有一个点: 如果我们用html-webpack-plugin插件,会生成一个html文件,打包好的js css文件都会加到html文件里,那么在html里,用script link标签引入的webpack生成的资源,它们的路径就会是 output.publicPath + output.filename
,所以项目部署到生产环境后,去拉取的资源路径也是这个。 也就是说,publicPath 设置成什么,index.html文件里,资源的基础路径就会是什么,从而项目部署到生产环境后,就会去这个地方找资源。
所以我们说:要想让生产环境下去哪里找资源,就配置 output.publicPath
就好了
而output.path和 publicPath完全无关,path只是指定了打包后文件的存放目录而已。
publicPath 有三种路径设置方式:
配置为相对路径。那么资源的引入路径,会是 相对于index.html文件
publicPath: './', // 相对于index.html获取资源 在index.html文件里,注入的资源路径: app.js就是与index.html同一目录下的文件 <script src="./app.js"></script>
配置为绝对路径,但不带域名
publicPath: '/assets/', // 从当前服务器 获取资源 <script src="/assets/app.js"></script>
配置为绝对路径,使用cdn,可配置全路径
publicPath: 'https://cdn.example.com/assets/', // 从这个域名里 获取资源 <script src="https://cdn.example.com/assets/app.js"></script>
不论是哪一种方式,尾部必须要带 /
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。