webpack4--处理第三方库引入

简介: webpack4--处理第三方库引入

引入第三方库通常有3种方法

1、npm 包管理: 目前最常用和最推荐的方法

2、CDN:<script></script>标签引入即可

3、手动下载,引入

这里我们着重说下前两个方法。

通常情况下我们什么都不处理的话,打出来的项目包应该是一个verndor.js一个main.css,这2个包包含了所有的js和css,这样导致的一个问题就是,如果我们引入的第三方库很多的情况,打出来的verndor.js包就会很大。那怎么处理呢?假如我们在页面安装了element-ui库和echarts库,这2个库都很大,我们希望把这2个库单独拎出来。

方法1、

index.html模板代码

<!DOCTYPE html>
<html lang="en">
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
        <div id="app"></div>
</body>
</html>

webpack.config.js配置

plugins:[
        new VueLoaderPlugin(),
        new HtmlwebpackPlugin({
            title: "this is title", //用于生成的HTML文档的标题。
            filename: "index.html", // 生成的模板文件的名字 默认index.html
            template: "index.html", //模板来源文件
            inject: 'body', //注入位置'head','body',true,false
            favicon: "", //指定页面图标
            minify: {
                caseSensitive: false, ////是否大小写敏感
                collapseBooleanAttributes: true, //是否简写boolean格式的属性如:disabled="disabled" 简写为disabled 
                collapseWhitespace: false //是否去除空格
            },
            hash: false, //是否生成hash添加在引入文件地址的末尾,类似于我们常用的时间戳,这个可以避免缓存带来的麻烦
            cache: false, //是否需要缓存,如果填写true,则文件只有在改变时才会重新生成
            showErrors: true, //是否将错误信息写在页面里,默认true,出现错误信息则会包裹在一个pre标签内添加到页面上
            // chunks: ['main'], //引入的a,b模块,这里指定的是entry中设置多个js时,在这里指定引入的js,如果不设置则默认全部引入,数组形式传入
            chunksSortMode: "auto", //引入模块的排序方式
            // excludeChunks: ['a', 'b'], //排除的模块,引入的除a,b模块以外的模块,与chunks相反
            xhtml: false //生成的模板文档中标签是否自动关闭,针对xhtml的语法,会要求标签都关闭,默认false
        }),
        new CleanWebpackPlugin(),
        new MiniCssExtractPlugin({
            filename:'static/css/[name].[chunkhash:8].css'
        })
    ],
    optimization: {
        minimizer: [
            //压缩js
            new UglifyJsPlugin({
                test: /\.js(\?.*)?$/i,
            }),
              //压缩css
            new OptimizeCssAssetsPlugin({})
        ],
        splitChunks: {
            chunks: 'all',
            cacheGroups: {
                libs: {
                    name: 'verndor',
                    test: /[\\/]node_modules[\\/]/,
                    priority: 10,
                },
                elementUI: {      
                    name: 'chunk-elementUI', // 单独将 elementUI 拆包      
                    priority: 20, // 权重要大于 commonsUi     
                    test: /[\\/]node_modules[\\/]_?element-ui(.*)/,    
                },
                echarts: {      
                    name: 'chunk-echarts', // 单独将 elementUI 拆包      
                    priority: 30, // 权重要大于
                    test: /[\\/]node_modules[\\/]_?echarts(.*)/,    
                },
                commonsUi: {
                    name: 'chunk-commons',
                    test: path.join(__dirname,'src/page'), // can customize your rules
                    minChunks: 2,//Math.ceil(pages.length / 3), 当你有多个页面时,获取pages.length,至少被1/3页面的引入才打入common包
                }
            }
        },
        runtimeChunk: {
          name: entrypoint => `runtime~${entrypoint.name}`
        }
    }

这样打出来的包结构如下


image.png

打包后.png

index.html的结构

image.png


index.png

可以看到我们把element-ui和echats单独打包出来了,这样的好处就是,element-ui和echats通常不变,就可以充分利用项目的缓存。

方法2、

我们直接在index.html里先引入需要拆分的第三方库的cdn地址。配置webpack的externals属性打包忽略插件

模板index.html代码

<!DOCTYPE html>
<html lang="en">
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>this is title</title>
        <!-- 引入样式 -->
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head>
<body>
        <div id="app"></div>
<!-- 引入组件库 -->
<script type="text/javascript" src="https://unpkg.com/vue"></script>//这里之所以把vue也改成cdn是因为element-ui是依赖vue的,所以也必须cdny引入
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script src="https://cdn.bootcss.com/echarts/4.1.0/echarts.min.js"></script>
</body>
</html>

webpack.config.js配置

externals: {
        'vue': 'Vue',
        'element-ui': 'element-ui',
        'echarts': 'echarts',
    },
    plugins:[
        new VueLoaderPlugin(),
        new HtmlwebpackPlugin({
            title: "this is title", //用于生成的HTML文档的标题。
            filename: "index.html", // 生成的模板文件的名字 默认index.html
            template: "index.html", //模板来源文件
            inject: 'body', //注入位置'head','body',true,false
            favicon: "", //指定页面图标
            minify: {
                caseSensitive: false, ////是否大小写敏感
                collapseBooleanAttributes: true, //是否简写boolean格式的属性如:disabled="disabled" 简写为disabled 
                collapseWhitespace: false //是否去除空格
            },
            hash: false, //是否生成hash添加在引入文件地址的末尾,类似于我们常用的时间戳,这个可以避免缓存带来的麻烦
            cache: false, //是否需要缓存,如果填写true,则文件只有在改变时才会重新生成
            showErrors: true, //是否将错误信息写在页面里,默认true,出现错误信息则会包裹在一个pre标签内添加到页面上
            // chunks: ['main'], //引入的a,b模块,这里指定的是entry中设置多个js时,在这里指定引入的js,如果不设置则默认全部引入,数组形式传入
            chunksSortMode: "auto", //引入模块的排序方式
            // excludeChunks: ['a', 'b'], //排除的模块,引入的除a,b模块以外的模块,与chunks相反
            xhtml: false //生成的模板文档中标签是否自动关闭,针对xhtml的语法,会要求标签都关闭,默认false
        }),
        new CleanWebpackPlugin(),
        new MiniCssExtractPlugin({
            filename:'static/css/[name].[chunkhash:8].css'
        })
    ],
    optimization: {
        minimizer: [
            //压缩js
            new UglifyJsPlugin({
                test: /\.js(\?.*)?$/i,
            }),
              //压缩css
            new OptimizeCssAssetsPlugin({})
        ],
    }

打包后效果


image.png

效果.png


其中打包后的index.html代码如下

<!DOCTYPE html>
<html lang="en">
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>this is title</title>
        <!-- 引入样式 -->
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<link href="static/css/main.4157de89.css" rel="stylesheet"></head>
<body>
        <div id="app"></div>
<!-- 引入组件库 -->
<script type="text/javascript" src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script src="https://cdn.bootcss.com/echarts/4.1.0/echarts.min.js"></script>
<script type="text/javascript" src="static/js/main.4dadea30.js"></script></body>//这个是打包的,其余3个是我们cdn引入的
</html>


相关文章
|
Windows
Mac 下SVN的使用(SnailSVN)
Mac 下SVN的使用(SnailSVN)
1491 0
|
移动开发 安全
uniapp打包成H5遇到的坑,本地访问页面空白
uniapp打包成H5遇到的坑,本地访问页面空白
1201 0
|
前端开发 小程序
前端解析支付宝返回form表单,自动跳转支付
前端解析支付宝返回form表单,自动跳转支付
766 1
|
存储 Java 文件存储
ZooKeeper 避坑实践: SnapCount设置不合理导致磁盘爆满,服务不可用
本篇通过深入解读ZooKeeper 数据文件生成机制,以及ZooKeeper 中和数据文件生成相关的参数,探究一下 解决 ZooKeeper 磁盘问题的最佳实践。
ZooKeeper 避坑实践: SnapCount设置不合理导致磁盘爆满,服务不可用
|
JSON 前端开发 JavaScript
Webpack5新特性:使用 Assets Module 处理图片和字体资源
本文介绍了 Webpack5 的 Assets Module ,是其内置的用来处理图片字体文件等资源模块的新功能。相比与过去通过 loader 的方式去处理,更加方便和简洁。
1508 0
|
12月前
Threejs实现动画
这篇文章讲解了如何使用Three.js实现动画效果,并介绍了如何控制动画的时间轴。
260 3
Threejs实现动画
|
12月前
ThreeJs使用tweenjs动画库制作动画
这篇文章介绍了如何在Three.js中使用Tween.js动画库来简化动画制作流程,并演示了如何通过简单的代码实现动画效果。
328 1
ThreeJs使用tweenjs动画库制作动画
|
安全 数据安全/隐私保护 Docker
Docker 容器连接:构建安全高效的容器化网络生态
Docker 容器连接:构建安全高效的容器化网络生态
301 0
|
缓存 监控 负载均衡
系统健康长期“三高”:实现高性能、高可用性和高稳定性的关键要素
大家想必都知道在人类健康领域,我们常常警惕“三高”带来的风险,三高是一个不健康的意思,而在数字化世界中,恰恰相反,系统的高性能、高可用性和高稳定性代表着系统的健康和卓越运行,是一个健康的概念。作为开发者怎么能让我们开发的系统保证长期“三高”,那么本文就来简单讨论一下如何让系统长期维持理想的“三高”标准,以及“三高”在实际业务场景中的真实性,并探索一下在技术负责人角色中使用“三高”来评价系统开发工作的可行性等内容,欢迎大家在评论区留言交流。
614 1
系统健康长期“三高”:实现高性能、高可用性和高稳定性的关键要素
|
机器学习/深度学习
西瓜书机器学习AUC与ℓ-rank(loss)的联系理解以及证明(通俗易懂)
西瓜书机器学习AUC与ℓ-rank(loss)的联系理解以及证明(通俗易懂)
554 0