webpack之基础打包优化的实现
作者:李知恩
前言
webpack
至今已经发展了5个版本,如果你还不会webpack
,那么赶紧学习起来吧。webpack
是web前端开发人员必学的一个知识点。本篇文章带大家一起看看webpack
基础的打包优化。话不多说,上酸菜~~~~
优化loader
在脚手架项目中,想必各位开发人员都会用到预处理的css
。比如sass、stylus、less
这些预处理语言。我们知道使用这些预处理css
必须要在webpack
中配置相应的loader
。
当我们配置过多的loader
时,各loader
之间必定会转换出大量的代码,这些代码会导致项目在启动和打包时变得非常慢,这个时候就需要我们去进行loader
的优化了。在loader
的相关的配置中,我们可以排除掉第三方包中的文件,减少loader
代码转换的范围。
module.exports = { module: { rules: [ test: /\.css$/, loader: ['style-loader', 'css-loader'], include: [resolve('src')],// 只在src文件夹下查找 // 不去查找的文件夹路径,node_modules下的代码是编译过得,没必要再去处理一遍 exclude: /node_modules/ ] } }
压缩代码
在webpack
中,我们可以使用UglifyjsWebpackPlugin
这个插件来压缩 js 和css的代码,从而减小项目打包的体积,提升打包速率。
注意:在开发环境我们不需要使用这个插件~
//安装插件 npm install uglifyjs-webpack-plugin --save-dev //在 vue.config.js中 /** 引入uglifyjs-webpack-plugin */ const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); /** 全局变量,当前环境 */ const env = process.env.NODE_ENV; module.exports = { ... configureWebpack: config => { if (env === "production") { config.optimization.minimizer.push( new UglifyJsPlugin({ //测试匹配压缩的文件 test: /.js(?.*)?$/i, //要被压缩的文件 include: //includes/, //是否开启文件缓存 cache: true, //是否开启多进程并行压缩 paralleL: true, // 使用uglifyOptions移除掉生产环境中的console uglifyOptions: { warnings: false, compress: {drop_console: true, drop_debugger: true, pure_funcs: ['console.log']} } })) }}}
uglifyjs-webpack-plugin
这个插件还有很多的配置项 具体可以参考uglifyjs-webpack-plugin
注意开启parallel
多进程压缩对项目打包速度的提升很有帮助
gzip压缩
除了压缩 js
和css
,我们还可以压缩webpack
打包之后的文件。
开启gzip
压缩后webpack
生成的js
文件的体积将缩小原来的30%以上。
要开启gzip
压缩 我们也需要用到一个插件compression-webpack-plugin
并且我们还需要保证服务端和客户端都支持gzip
。
//安装插件 npm install compression-webpack-plugin --save-dev //在 vue.config.js中 /** 引入compression-webpack-plugin */ const CompressionWebpackPlugin = require('compression-webpack-plugin'); const productionGzipExtensions = /.(js|css|json|txt|html|icon|svg)(?.*)$/i module.exports = { ... configureWebpack: config => { if (env === "production") { config.plugins.push({ new CompressionWebpackPlugin({ filename: '[path].gz[query]', algorithm: 'gzip', test: productionGzipExtensions, threshold: 10240, minRatio: 0.8 }) }) }}}
compression-webpack-plugin
这个插件同样也有很多的配置项,具体参考compression-webpack-plugin
抽离公共依赖包
对于一些体积较大,不长更新的包,我们并不需要下载到项目中使用。我们可以选择使用cdn的方式去进行引入,当然最好还是将这些库放在自己的服务器下~ webpack
允许我们在外部引入一些资源。
在webpack
的配置中有这样一个配置项 externals
:
防止将某些
import
的包(package)打包到bundle
中,而是在运行时(runtime)再去从外部获取这些扩展依赖(external dependencies) 。
从外部加载扩展的依赖而不是在项目中获取。 显然,这肯定能减少项目大小,缩小打包体积。
抽离公共依赖包我们也需要安装一个插件html-webpack-plugin
。使用这个插件主要是将外部引入的cdn放到index.html
中加载。
如果你的webpack的版本大于4.0那么你无需安装,webpack4.0
已经自带了该插件。本项目中的webpack
的版本是4.2.15的因此无需安装
下面和我一起看看该如何进行配置:
// 在 vue.config.js中 const baseUrl = 'https://minturechan.oss-cn-shenzheng.aliyuncs.com/npm' const cdn = { js: [`${baseUrl}vue@2.6.11/dist/vue.min.js`, `${baseUrl}vue-router@3.2.0/dist/vue-router.min.js`, `${baseUrl}vuex@3.4.0/dist/vuex.min.js`, `${baseUrl}view-design@4.0.0/dist/iview.min.js`, `${baseUrl}jquery@3.4.1/dist/jquery.min.js` ], css: [`${baseUrl}view-design@4.0.0/dist/styles/iview.css`] } module.exports ={ chainWebpack: config => { //config.plugin('html')这个表示获取 html-webpack-plugin这个插件~ config.plugin('html').tap(args => { if (env === "production") { args[0].cdn = cdn } return args }) } }
在vue.config.js
中配置完成后 我们还需要在public
文件夹下的index.html
中引入
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no"> <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" /> <link rel="icon" href="<%= BASE_URL %>zyd.ico" rel="external nofollow" > <title>test</title> <% for (var i in htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.css) { %> <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="external nofollow" rel="external nofollow" rel="preload" as="style" /> <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="external nofollow" rel="external nofollow" rel="stylesheet" /> <% } %> <% for (var i in htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.js){ %> <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script> <% } %> </head> <body> <div id="app"> <!-- built files will be auto injected --> </div> </body> </html>
在index.html
中加上如下代码即可引入外部cdn资源~~
最后
webpack
还有非常多可以优化的地方,本文只是简单的说明了一些webpack
基础的打包优化配置。
到此这篇关于webpack之基础打包优化的实现的文章就介绍到这了,更多相关webpack 打包优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!