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>


相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
7月前
|
缓存 前端开发
Vite 和 Webpack 的区别
Vite 和 Webpack 的区别
240 0
|
1月前
|
监控 前端开发 JavaScript
Webpack 中 HMR 插件的工作原理
【10月更文挑战第23天】可以进一步深入探讨 HMR 工作原理的具体细节、不同场景下的应用案例,以及与其他相关技术的结合应用等方面的内容。通过全面、系统地了解 HMR 插件的工作原理,能够更好地利用这一功能,为项目的成功开发提供有力保障。同时,要不断关注技术的发展动态,以便及时掌握最新的 HMR 技术和最佳实践。
|
前端开发 JavaScript
vite和webpack 区别
vite和webpack 区别
83 0
|
7月前
|
前端开发 JavaScript 开发者
深入了解Webpack:前端模块打包工具
深入了解Webpack:前端模块打包工具
105 1
|
7月前
|
前端开发 JavaScript 开发者
vite和webpack区别
【4月更文挑战第14天】Vite与Webpack都是前端构建工具,各有特点。Vite凭借原冷启动和模块热更新,适合现代前端项目,尤其是Vue、React等。它的配置简单,但社区支持较小。相比之下,Webpack拥有强大的插件系统和广泛社区支持,能适应各种项目需求,但配置复杂,启动慢。开发者应根据项目需求选择合适的工具。
165 2
|
7月前
|
JavaScript 开发者
Vite和Webpack的区别是什么
Vite和Webpack的区别是什么
|
7月前
|
JSON 前端开发 JavaScript
Vite和Webpack区别
Vite和Webpack区别
160 0
|
JavaScript 开发工具 git
webpack进阶篇(二十五):webpack打包组件和基础库
webpack进阶篇(二十五):webpack打包组件和基础库
525 0
webpack进阶篇(二十五):webpack打包组件和基础库
|
7月前
|
JavaScript 前端开发
在项目中引入webpack打包工具
在项目中引入webpack打包工具
|
前端开发 JavaScript 开发者
webpack模块打包器
Webpack是一种前端资源构建工具,可以将多个文件和模块打包成一个或多个bundle。它具有高度的可配置性,支持各种类型的文件和插件,可以自定义打包过程和结果。Webpack的核心概念包括入口、出口和模式,可以分别用于指示打包的起点、输出位置和优化级别。Webpack还具有自动化构建过程,通过Tapable机制组织多个处理流程,并允许插件监听特定事件来参与整个构建过程。总之,Webpack是一个功能强大的前端资源构建工具,提供了高度可配置的选项和插件机制,方便开发者进行自定义和扩展。