前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【第13期】webpack入门学习手记(五)

【第13期】webpack入门学习手记(五)

作者头像
siberiawolf
发布于 2020-03-24 09:13:41
发布于 2020-03-24 09:13:41
1.4K00
代码可运行
举报
文章被收录于专栏:前端修炼之路前端修炼之路
运行总次数:0
代码可运行

webpack

本人微信公众号:前端修炼之路,欢迎关注。

前几天朋友聚餐突然想到,再过不到半年时间,第一批20后即将出生。这种感觉就像是,现在的90后看60后~ 一不小心我们这些90后在20后的眼中就变成了上个世纪的人。o(╯□╰)o

回顾webpack这个系列,结合自己使用的一个过程,是时候结束一下了。

css优化

我在项目中发现,有些时候css会有重复,或者不知道谁写的根本就没有使用过的css样式。如果文件较小,影响不是很大。但是我有一个项目,发现其中的css有9000多行!

对于有代码洁癖的我来说,这是不能忍受的~要是文件小的话,我还有机会可以一行行的查找,将多余的代码删除。可惜这个文件内容过多。好在找到了一个webpack插件mini-css-extract-plugin,这个插件结合purifycss-webpack使用,就可以满足我的需求,将功能交给webpack去做。

mini-css-extract-plugin

mini-css-extract-plugin这个插件可以在webpack plugins中查看更多配置选项。这里我先只使用最简单的配置项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

plugins: [
    new MiniCssExtractPlugin({          // css文件抽离
        filename: 'css/[name].min.css',    // 指定抽离之后文件的名字和并且在css路径之下
        chunkFilename: 'css/[id].min.css',
    }),
],
module: {
    rules: [
        {
            test: /\.css$/, // 因为我项目中只有css代码,所以正则只写css
            use: [
                {
                    loader: MiniCssExtractPlugin.loader, // 指定使用mimi-css-extract-plugin
                    options: {
                        publicPath: '../',
                        hmr: process.env.NODE_ENV === 'development',    // 只在开发环境下开启hmr
                    },
                },
                'css-loader',        // 使用css-loader
            ],
        }
    ]
}

purifycss-webpack

purifycss-webpack这个插件可以去npm 官网查看更多配置项。

注:如果打开purifycss-webpack这个插件的npm说明,页面中会提示使用extract-text-webpack-plugin这个插件,并且示例代码也是用这个插件演示的。但其实这个插件已经废弃了。官网推荐的使用就是上面使用的mini-css-extract-plugin这个插件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const glob = require('glob');    // 这里一定要安装glob-all这个插件而不是glob
const PurifyCSSPlugin = require('purifycss-webpack');

new PurifyCSSPlugin({       // css 文件去重
    paths: glob.sync(path.join(__dirname, 'index.html')) // 指定html页面,也可以使用通配符*进行匹配全部html
})

purifycss-webpackmini-css-extract-plugin两者结合使用,才能实现将css去重。

optimize-css-assets-webpack-plugin

去重实现以后,文件缩减了不少,可是我还不满足。因为我想在线上使用压缩的css,进一步缩小文件的大小,节省用户流量。如果自习阅读刚才文档,会发现MiniCssExtractPlugin这个插件之中有提到生成环境下使用压缩css和js的插件。

所以我就直接使用就好了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const TerserJSPlugin = require('terser-webpack-plugin');

 optimization: {
     minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})],   // js压缩和css 压缩
 }

图片优化

url-loader

css提取去重、css压缩完成之后,又发现可以进一步优化的地方。网站中一般都会使用一些小图标和logo,有些小图标会做成雪碧图,有些并不会。后来通过搜索,发现其实可以将一些足够小的小图标制作成base64,将小图标写到css文件中,从而减少http请求数量。如果手动去做这个过程,是比较繁琐的。还好找到了url-loader这个插件。插件详细配置可以看webpack Loaders

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module: {
        rules: [
            {
                test: /\.(png|jpe?g|gif|svg)$/i,    // 匹配的图片文件类型
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 1024,  // 将1024以下的图片制作成base64图片,超过的不处理
                            name: '[name].[ext]',
                            outputPath: 'img/',
                            publicPath: '../img/'   // 指定这个地址之后,css中的background才会变成了base64~,并且路径使用的是这个路径
                        },
                    }
                ]
            }
       ]
}

需要说明的是,我修改了以下正则/\.(png|jpe?g|gif|svg)$/i,这样jpgjpeg就都能匹配到了。另外需要指定limit这个参数,表示在limit配置的数值以下的图片才进行base64编码,超过的不进行处理。

在这个过程中,遇到的问题就是,如果图片没有base64,就会造成背景图片background中引用的url地址不正确,导致图片引用失败。后来经过调试发现,指定options.publicPath这个属性,就可以正确引用了。

image-webpack-loader

处理完小图标,我想到需要处理一下大图片。因为如果仅仅处理了小图标,影响似乎并不大。真正占流量的其实是图片。其实在做项目的时候,会将png图片进行一遍压缩。但是我之前是使用的在线工具。现在我想使用打包工具,自动化进行处理。

image-webpack-loader可以压缩png、jpeg、gif、webp、svg。可以分别指定不同类型图片的压缩质量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
     loader: 'image-webpack-loader',
     options: {
             mozjpeg: {
                  progressive: true,
                  quality: 65
             },
             // optipng.enabled: false will disable optipng
             optipng: {
                  enabled: false,
             },
             pngquant: {
                  quality: '65-90',
                  speed: 4
             },
             gifsicle: {
                  interlaced: false,
             },
             // the webp option will enable WEBP
             webp: {
                  quality: 75
             }
   }
}

使用完这个插件之后,确实发现我的图片缩小了不少。

整个配置

上面只是简单的罗列出来了需要使用的各个loaderplugin。但是整个配置并不完整,完整的webpack-config.js代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const path = require('path');
const glob = require('glob');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const TerserJSPlugin = require('terser-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const PurifyCSSPlugin = require('purifycss-webpack');

module.exports = {
    mode: 'production',
    entry: {
        style: './js/style.js',
    },
    optimization: {
        minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})],   // css 压缩
    },
    plugins: [
        new CleanWebpackPlugin(),               // 文件清空
        new MiniCssExtractPlugin({          // css文件抽离
            filename: 'css/[name].min.css',
            chunkFilename: 'css/[id].min.css',
        }),
        new PurifyCSSPlugin({       // css 文件去重
            paths: glob.sync(path.join(__dirname, 'index.html')),
        })
    ],
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    {
                        loader: MiniCssExtractPlugin.loader,
                        options: {
                            publicPath: '../',
                            hmr: process.env.NODE_ENV === 'development',
                        },
                    },
                    'css-loader',
                ],
            },
            {
                test: /\.(png|jpe?g|gif|svg)$/i,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 1024,
                            name: '[name].[ext]',
                            outputPath: 'img/',
                            publicPath: '../img/'   // 指定这个地址之后,css中的background才会变成了base64~,并且路径使用的是这个路径
                        },
                    },
                    {
                        loader: 'image-webpack-loader',
                        options: {
                            mozjpeg: {
                                progressive: true,
                                quality: 65
                            },
                            // optipng.enabled: false will disable optipng
                            optipng: {
                                enabled: false,
                            },
                            pngquant: {
                                quality: '65-90',
                                speed: 4
                            },
                            gifsicle: {
                                interlaced: false,
                            },
                            // the webp option will enable WEBP
                            webp: {
                                quality: 75
                            }
                        }
                    }
                ],
            }
        ],
    },
    output: {
        filename: '[name].min.js',
        path: path.resolve(__dirname, './dist')
    }
};
  • 文件的entry入口是style.js
  • 所有的打包文件目录是通过output.path指定的,输出到了dist目录下。
  • 在配置loader时,可以在一个正则匹配下,配置多个loader。例如我先配置了url-loader,然后配置了image-webpack-loader

在入口文件style.js中,其实什么事情也没有做,只是引入了需要使用的css文件。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import style from '../css/style.css';

所以过程就是style.js引入了style.css,然后webpack进行打包处理,生成style.min.jsstyle.min.css

整个的项目结构如下:

项目目录


以上就是我在项目中使用webpack的一个情况。目前这个入门学习手记到这里就结束了。

(完)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端修炼之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
webpack优化
webpack.config 按照production和dev分开配置, wepback.base.config.js
刘嘿哈
2022/10/25
2330
webpack 入门教程
本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。
老马
2018/08/20
4.1K0
webpack 入门教程
webpack 4 配置备忘
webpack.dev.js const merge = require('webpack-merge'); const webpack = require("webpack"); const path = require('path'); const common = require('./webpack.common.js'); module.exports = merge(common, { output: { // 出口文件 path: __dirname + '/dist
蓓蕾心晴
2021/12/16
2880
【Cute-Webpack】Webpack4 入门手册(共 18 章)
最近和部门老大,一起在研究团队【EFT - 前端新手村】的建设,目的在于:帮助新人快速了解和融入公司团队,帮助零基础新人学习和入门前端开发并且达到公司业务开发水平。
pingan8787
2019/08/15
2.4K1
webpack多页面配置
webpack.common.js const webpack = require("webpack"); const path = require('path'); const glob = require('glob'); const HtmlWebpackPlugin = require('html-webpack-plugin'); // html引擎 const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const Ht
蓓蕾心晴
2019/08/20
1.1K0
Webpack4 搭建 Vue 项目
由于 Parcel 打包工具的影响,webpack4 也追求零配置搭建项目。而前阵子出现的 vue-cli 3.0也是基于 webpack4 零配置的思想创建的。对于一些习惯webpack3 的开发者难免有些不习惯。本文就带你绕过 vue-cli,用 webpack4 一步步搭建 vue 项目。
小皮咖
2019/11/05
1.1K0
手把手带你使用webpack4构建一个Vue开发编译环境,并实现代码分割,css代码分离
本篇文章不会细致讲webpack生产编译方面的优化操作,主要点是为了区分开发与生产环境的区别,代码分割分离的操作,所以不建议各位使用本篇文章内配置内容去进行生产编译,生产编译其它优化细节请各位自行另加配置,当然本篇文章配置也不是不能用作生产配置,只是给各位一个建议~
吴佳
2022/09/26
8900
一文彻底读懂webpack常用配置
const TerserPlugin = require('terser-webpack-plugin');
gogo2027
2022/10/18
4570
webpack4配置入门和进阶
webpack作为一个模块打包器,主要用于前端工程中的依赖梳理和模块打包,将我们开发的具有高可读性和可维护性的代码文件打包成浏览器可以识别并正常运行的压缩代码,主要包括样式文件处理成css,各种新式的JavaScript转换成浏览器认识的写法等,也是前端工程师进阶的不二法门,本文借鉴了部分vue-cli对webpack的配置思路,还有一些网上比较好的解决方案,在此对这些作者一并表示感谢。 webpack.config.js配置项简介 Entry:入口文件配置,Webpack 执行构建的第一步将从 Entry
卡少
2018/05/16
3.5K0
webpack 配置多页面应用的一次尝试
然后在 /build/utils.js 创建 getHtmlArray 方法,用来自动生成多个模板的配置:
神葳
2021/01/22
9090
webpack 学习笔记系列04-资源处理优化
TypeScript 约定了 tsconfig.json 文件来存储项目配置,文档链接。
CS逍遥剑仙
2021/02/21
1.8K0
【Webpack】320- Webpack4 入门手册(共 18 章)(下)
最近和部门老大,一起在研究团队【EFT - 前端新手村】的建设,目的在于:帮助新人快速了解和融入公司团队,帮助零基础新人学习和入门前端开发并且达到公司业务开发水平。
pingan8787
2019/08/20
2.4K0
【Webpack】320- Webpack4 入门手册(共 18 章)(下)
webpack 4 的 30 个步骤打造优化到极致的 react 开发环境
将 react 和 webpack4 进行结合,集 webpack 的优势于一身,从 0 开始构建一个强大的 react 开发环境。
夜尽天明
2019/06/18
2.4K0
【Webpack】319- Webpack4 入门手册(共 18 章)(上)
最近和部门老大,一起在研究团队【EFT - 前端新手村】的建设,目的在于:帮助新人快速了解和融入公司团队,帮助零基础新人学习和入门前端开发并且达到公司业务开发水平。
pingan8787
2019/08/20
1.8K0
【Webpack】319- Webpack4 入门手册(共 18 章)(上)
笔记 | 一些常用的 webpack 配置
webpack 官网 https://webpack.js.org/guides/ 示例代码 官网 https://github.com/zkeq/jirengu_learn_09 初始化 npm 仓库 npm init -y 安装 webpack yarn add -D webpack yarn add -D webpack-cli yarn add -D webpack-dev-server 初始化 webpack.config.js const path = require('path'); m
Zkeq
2022/09/19
3120
vue.config.js的优化配置(element-ui, echarts, lodash按需加载 )
“关注 前端开发社区 ,回复“ 1” 即可加入 前端技术交流群,回复 “ 2” 即可免费领取500G前端干货!
前端老道
2020/09/11
8.5K0
vue.config.js的优化配置(element-ui, echarts, lodash按需加载 )
18款Webpack插件,总会有你想要的!
这篇文章整理了18个Webpack插件,分享给Web开发的小伙伴。Plugin是一个扩展器,它丰富了webpack本身,针对的是loader结束后,webpack打包的整个过程,它并不直接操作文件,而是基于事件机制工作,会监听webpack打包过程中的某些分段,执行广泛的任务。
王小婷
2020/10/26
1.4K0
webpack4大结局:加入腾讯IM配置策略,实现前端工程化环境极致优化
在此对webpack的性能优化进行几点声明: 在部分极度复杂的环境下,需要双package.json文件,即实行三次打包 在代码分割时,低于18K的文件没必要单独打包成一个chunk,http请求次数过多反而影响性能 prerender和PWA互斥,这个问题暂时没有解决 babel缓存编译缓存的是索引,即hash值,非常吃内存,每次开发完记得清理内存 babel-polyfill按需加载在某些非常复杂的场景下比较适合 prefetch,preload对首屏优化提升是明显 代码分割不管什么技术栈,一
Peter谭金杰
2019/08/02
2.1K0
三款快速删除未使用CSS代码的工具
针对历史项目或项目中有引入CSS框架(如Bootstrap),可能会存在大量的 CSS 样式未被使用。这可能产生一些不良的影响,如:
奋飛
2023/08/13
1.3K0
三款快速删除未使用CSS代码的工具
从零开始配置webpack(基于webpack 4 和 babel 7版本)
webpack启动后会从 Entry 里配置的 Module 开始递归解析 Entry 依赖的所有Module.每找到一个Module,就会根据配置的Loader去找出对应的转换规则,对Module进行转换后,再解析出当前的Module依赖的Module.这些模块会以Entry为单位进行分组,一个Entry和其所有依赖的Module被分到一个组也就是一个Chunk。最好Webpack会把所有Chunk转换成文件输出。在整个流程中Webpack会在恰当的时机执行Plugin里定义的逻辑。
胡哥有话说
2019/09/12
6750
相关推荐
webpack优化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验