webpack之基础打包优化的实现

 更新时间:2022年02月09日 15:12:08   作者:李知恩  
本文主要介绍了webpack之基础打包优化的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<BR>

前言

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压缩

除了压缩 jscss,我们还可以压缩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 打包优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Javascript模拟scroll滚动效果脚本

    Javascript模拟scroll滚动效果脚本

    项目需要写了一段模拟Scroll滚动代码,分享的同时,我有些疑问,希望大家能帮忙解决,代码如下
    2008-09-09
  • js简单实现图片延迟加载的方法

    js简单实现图片延迟加载的方法

    这篇文章主要介绍了js简单实现图片延迟加载的方法,涉及javascript针对页面元素的遍历与动态设置技巧,需要的朋友可以参考下
    2016-07-07
  • javascript实现用户点击数量统计

    javascript实现用户点击数量统计

    本文主要javascript实现用户点击数量统计的方法进行详细介绍,具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • toString.call()通用的判断数据类型方法示例

    toString.call()通用的判断数据类型方法示例

    这篇文章主要给大家介绍了关于toString.call()通用的判断数据类型方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Javascript 匿名函数及其代码模式原理

    Javascript 匿名函数及其代码模式原理

    很多同学知道怎么用这种匿名函数,却或许并不明白为什么这样写就能够调用匿名函数。也许知道后面的圆括号是执行前面的函数,而并不清楚前面的圆括号具有何种含义!本文将带你了解匿名函数的代码模式原理。
    2010-03-03
  • javascript操作元素的常见方法小结

    javascript操作元素的常见方法小结

    这篇文章主要介绍了javascript操作元素的常见方法,结合实例形式总结分析了JavaScript针对页面元素动态获取、赋值、动态操作相关使用技巧,需要的朋友可以参考下
    2019-11-11
  • javascript中的prototype属性使用说明(函数功能扩展)

    javascript中的prototype属性使用说明(函数功能扩展)

    一说到prototype很多人可能第一个想到的是著名的prototype.js框架,当然我们今天说的不是它,而是Javascript中的prototype属性,一般都被翻译为“原型”。
    2010-08-08
  • 比较常见的javascript中定义函数的区别

    比较常见的javascript中定义函数的区别

    js定义函数有好多种,但是他们之间的区别,大家都了解吗,接下来,小编通过本文给大家介绍比较常见的js中定义函数的区别,对本文感兴趣的朋友一起看看吧
    2015-11-11
  • uniapp分包(小程序分包)处理图文详解

    uniapp分包(小程序分包)处理图文详解

    小程序上传的时候,主包不能超过2M,如果超出,则会上传失败,这时候就需要把界面进行分包,下面这篇文章主要给大家介绍了关于uniapp分包(小程序分包)处理的相关资料,需要的朋友可以参考下
    2023-01-01
  • javascript同步Import,同步调用外部js的方法

    javascript同步Import,同步调用外部js的方法

    javascript同步Import,同步调用外部js的实现代码,测试确实可用
    2008-07-07

最新评论