优化资源加载 1 - 图片加载优化和代码压缩
CSS Sprites
CSS Sprites 技术是前端领域一种很常见的用于减少图片资源请求数的优化方式。
如果使用 webpack 3.x 版本,需要 CSS Sprites 的话,可以使用 webpack-spritesmith 或者 sprite-webpack-plugin。
以 webpack-spritesmith 为例,先安装依赖:
npm install webpack-spritesmith --save-dev
在 webpack 的配置中应用该插件:
module: {loaders: [// ... 这里需要有处理图片的 loader,如 file-loader]},resolve: {modules: ['node_modules','spritesmith-generated', // webpack-spritesmith 生成所需文件的目录],},plugins: [new SpritesmithPlugin({src: {cwd: path.resolve(__dirname, 'src/ico'), // 多个图片所在的目录glob: '*.png' // 匹配图片的路径},target: {// 生成最终图片的路径image: path.resolve(__dirname, 'src/spritesmith-generated/sprite.png'),// 生成所需 SASS/LESS/Stylus mixins 代码,使用 Stylus 预处理器做例子css: path.resolve(__dirname, 'src/spritesmith-generated/sprite.styl'),},apiOptions: {cssImageRef: "~sprite.png"},}),],
在需要的样式代码中引入 sprite.styl 后调用需要的 mixins 即可
@import '~sprite.styl'.close-buttonsprite($close).open-buttonsprite($open)
图片压缩
在一般的项目中,图片资源会占前端资源的很大一部分,既然代码都进行压缩了,占大头的图片就更不用说了。
可以用 file-loader 来处理图片文件,在此基础上,再添加一个 image-webpack-loader 来压缩图片文件。配置如下:
= {...module: {rules: [{test: /.*\.(gif|png|jpe?g|svg|webp)$/i,use: [{loader: 'file-loader',options: {}},{loader: 'image-webpack-loader',options: {mozjpeg: { // 压缩 jpeg 的配置progressive: true,quality: 65},optipng: { // 使用 imagemin-optipng 压缩 png,enable: false 为关闭enabled: false,},pngquant: { // 使用 imagemin-pngquant 压缩 pngquality: '65-90',speed: 4},gifsicle: { // 压缩 gif 的配置interlaced: false,},webp: { // 开启 webp,会把 jpg 和 png 图片压缩为 webp 格式quality: 75},},],},],},}
image-webpack-loader 的压缩是使用 imagemin 提供的一系列图片压缩类库来处理的。
使用 DataURL
项目中会有一些很小的图片,因为某些缘故并不想使用 CSS Sprites 的方式来处理(譬如小图片不多,因此引入 CSS Sprites 感觉麻烦),可以在 webpack 中使用 url-loader 来处理这些很小的图片。
url-loader 和 file-loader 的功能类似,但是在处理文件的时候,可以通过配置指定一个大小,当文件小于这个配置值时,url-loader 会将其转换为一个 base64 编码的 DataURL,配置如下:
module.exports = {// ...module: {rules: [{test: /\.(png|jpg|gif)$/,use: [{loader: 'url-loader',options: {limit: 8192, // 单位是 Byte,当文件小于 8KB 时作为 DataURL 处理},},],},],},}
代码压缩
webpack 4.x 版本运行时,mode 为 production 即会启动压缩 JS 代码的插件,而对于 webpack 3.x,使用压缩 JS 代码插件的方式也已经介绍过了。在生产环境中,压缩 JS 代码基本是一个必不可少的步骤,这样可以大大减小 JavaScript 的体积。
除了 JS 代码之外,还需要 HTML 和 CSS 文件,这两种文件也都是可以压缩的,虽然不像 JS 的压缩那么彻底(替换掉长变量等),只能移除空格换行等无用字符,但也能在一定程度上减小文件大小。在 webpack 中的配置使用也不是特别麻烦,所以通常也会使用。
对于 HTML 文件, html-webpack-plugin 插件可以帮助我们生成需要的 HTML 并对其进行压缩:
module.exports = {// ...plugins: [new HtmlWebpackPlugin({filename: 'index.html', // 配置输出文件名和路径template: 'assets/index.html', // 配置文件模板minify: { // 压缩 HTML 的配置minifyCSS: true, // 压缩 HTML 中出现的 CSS 代码minifyJS: true // 压缩 HTML 中出现的 JS 代码}}),],}
使用 minify 字段配置就可以使用 HTML 压缩,这个插件是使用 html-minifier 来实现 HTML 代码压缩的,minify 下的配置项直接透传给 html-minifier。
对于 CSS 文件,用处理 CSS 文件的 css-loader,也提供了压缩 CSS 代码的功能:
module.exports = {module: {rules: [// ...{test: /\.css/,include: [path.resolve(__dirname, 'src'),],use: ['style-loader',{loader: 'css-loader',options: {minimize: true, // 使用 css 的压缩功能},},],},],}}
在 css-loader 的选项中配置 minimize 字段为 true 来使用 CSS 压缩代码的功能。css-loader 是使用 cssnano 来压缩代码的,minimize 字段也可以配置为一个对象,来将相关配置传递给 cssnano。
