捣鼓了几天 webpack 后终于有点收获了,这里记录一下觉得比较重要的东西。
关于webpack 的安装
- 需要现在全局安装 webpack 才能在命令行中使用 webpack 命令
1 | $ npm install -g webpack |
- 再在项目中按装本地 webpack
1 | $ npm install webpack --save-dev |
- 在 webpack 4+ moulde 的 loaders 改用 rules 用
1 | module: { |
出一份最近做 vue 项目的 package.json
文件
node v10.14.2
、 webpack 4
、webpack-dev-server
,其他依赖在当时这个时间点差不多是最新的。项目较小主要是做练习模块化和vue组件化为主要目的,没有数据交互,仅单页面跳转。但是大体的配置就是这样了,还有些没有用到的依赖,以后遇到会添加,会越来越完善的。1 | { |
紧接上面 package.json
的一份 webpack.config.js
配置文件
因为是小项目就在单个 config 文件中配置了环境变量
1 | const path = require('path'); |
npm 安装依赖
安装环境区分
- 安装到生产环境中
dependencies
1 | $ npm install --save-dev file-loader |
- 安装到开发环境中
devDependencies
1 | $ npm install --save file-loader |
常用的依赖
url-loader
图片低于 limit 值 会自动返回 DataURL (base64)
官网文档: https://webpack.docschina.org/loaders/url-loader
安装:
1 | $ npm install --save-dev url-loader |
配置:
1 | // 一般配置 |
参数说明:
参数说明来自天空影
其实最重要的就是他的这几个参数:limit
、name
、outputPath
、publicPath
limit
:文件大小小于limit参数,url-loader
将会把文件转为DataURL;文件大小大于limit,url-loader
会调用file-loader
进行处理,参数也会直接传给file-loader
。name
:输出的文件名规则,如果不添加这个参数,输出的就是默认值:文件哈希;加上[path]表示输出文件的相对路径与当前文件相对路径相同,加上[name].[ext]
则表示输出文件的名字和扩展名与当前相同。加上[path]这个参数后,打包后文件中引用文件的路径也会加上这个相对路径。outputPath
:表示输出文件路径前缀。图片经过url-loader
打包都会打包到指定的输出文件夹下。但是我们可以指定图片在输出文件夹下的路径。比如outputPath=img/
,图片被打包时,就会在输出文件夹下新建(如果没有)一个名为img的文件夹,把图片放到里面。publicPath
:表示打包文件中引用文件的路径前缀,如果你的图片存放在CDN
上,那么你上线时可以加上这个参数,值为CDN
地址,这样就可以让项目上线后的资源引用路径指向CDN
了
file-loader
和 url-loader
一块使用了,结果图片就破损了也没有导出 DataURL
。找原因的时候以为是配置问题,但是各种改的也不是。最后发现这两个 loader
是不能一起使用的 image-webpack-loader
图片压缩
官网文档: https://github.com/tcoopman/image-webpack-loader
安装:
1 | $ npm install image-webpack-loader --save-dev |
配置:
1 | // 一般配置 |
参数对照表:
- mozjpeg — Compress JPEG images
- optipng — Compress PNG images
- pngquant — Compress PNG images
- svgo — Compress SVG images
- gifsicle — Compress GIF images
- webp — Compress JPG & PNG images into WEBP
加载数据
json
的加载在 webpack 中是内置的,不需要依赖 loader
。但是要导入 CSV
、TSV
和 XML
,你可以使用 csv-loader
和 xml-loader
。
安装:
1 | $npm install --save-dev csv-loader xml-loader |
配置:
1 | rules: [ |
plugins
WebpackManifestPlugin
,该插件能够在项目根目录生成一份## manifest.json的文件,通过该文件的映射关系可以让我们知道webpack是如何追踪所有模块并映射到输出bundle中的。
官方文档:https://github.com/danethurber/webpack-manifest-plugin
安装:
1 | $ npm install --save-dev webpack-manifest-plugin |
配置:
1 | plugins: [ |
css提取压缩(生产环境使用插件)
- 第一种方式:
webpack 4 环境下:使用 extract-text-webpack-plugin
的测试版,因为稳定版还没有跟上 webpack 的脚步。
安装:1
$ npm i extract-text-webpack-plugin@next -D
- 第二种方式:
需要用到两种插件
提取 css 到 dist 目录下:mini-css-extract-plugin
插件 webpack 4 官方推荐插件
压缩 css:optimize-css-assets-webpack-plugin
插件
官网文档:mini-css-extract-plugin optimize-css-assets-webpack-plugin
安装 mini-css-extract-plugin
1 | $ npm i mini-css-extract-plugin -D |
配置:
1 | const MiniCssExtractPlugin = require('mini-css-extract-plugin'); |
安装 optimize-css-assets-webpack-plugin
1 | $ npm i optimize-css-assets-webpack-plugin -D |
配置:
这个插件可以接受下列配置(均为可选):
assetNameRegExp: 正则表达式,用于匹配需要优化或者压缩的资源名。默认值是 /.css$/g
cssProcessor: 用于压缩和优化CSS 的处理器,默认是 cssnano.这是一个函数,应该按照 cssnano.process 接口(接受一个CSS和options参数,返回一个Promise)
canPrint: {bool} 表示插件能够在console中打印信息,默认值是true
1 | var OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin'); |
关于浏览器的缓存技术(回头专门研究一下)
客户端(通常是浏览器)就能够访问网站此服务器的网站及其资源。而最后一步获取资源是比较耗费时间的,这就是为什么浏览器使用一种名为 缓存 的技术。可以通过命中缓存,以降低网络流量,使网站加载速度更快,然而,如果我们在部署新版本时不更改资源的文件名,浏览器可能会认为它没有被更新,就会使用它的缓存版本。由于缓存的存在,当你需要获取新的代码时,就会显得很棘手
Webpack 的静态资源持久缓存