浅谈webpack打包之后的文件过大的解决方法


Posted in Javascript onMarch 07, 2018

以前一直使用 create-react-app 这个脚手架进行 react 开发,后面因为一些自定义的配置,转而使用 webpack 搭建一套自己的脚手架。但是在使用 webpack 打包之后发现,纳尼?怎么文件这么大??? 于是研究了一下如何处理 webpack 打包之后文件太大的情况,简单记录下来。

首先配置全局变量

首先,通过指定环境,告诉 webpack 我们当前处于 production 环境中,要按照 production 的方式去打包。

//指定环境,将process.env.NODE_ENV环境与library关联
 new Webpack.DefinePlugin({
 'process.env.NODE_ENV': JSON.stringify('production'),
 }),

优化 devtool 中的 source-map .

dev-tool 提供了很多种选项,用来增强我们 debug 的能力,我们熟知的有: source-map , inline-source-map , cheap-source-map 等等。详细的用法可以参考Devtool官方文档,Devtool配置对比 , webpack sourcemap 选项多种模式的一些解释 , https://webpack.github.io/docs/configuration.html#devtool 如果你的文件在打包之后突然变成好几M,那么不用想,肯定是因为 source-map 的原因。 source-map 在开发阶段确实很好用,调试起来很方便,但是在生产环境下就没必要部署了。 建议在 prod 环境下关闭 source-map 。

剥离css文件,单独打包

安装 webpack 插件 extract-text-webpack-plugin 。 npm install extract-text-webpack-plugin --save-dev 。 使用方法:

plugins:[
 new ExtractTextPlugin('static/css/styles.[contenthash].css'),
]

这里使用了 contenthash , webpack 会根据内容去生成 hash 值。

使用 UglifyJSPlugin 压缩。

通过 UglifyJSPlugin 可以压缩我们的 *.js 文件。 安装方法: npm install uglifyjs-webpack-plugin --save-dev 。 用法: UglifyJSPlugin详细用法

const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
module.exports = {
 plugins: [
   new UglifyJSPlugin({
      parallel: 4,
      uglifyOptions: {
        output: {
          comments: false,
          beautify: false,
        },
        compress: {
          warnings: false
        },
      },
      cache: true,
    }),
 ]
}

提取公共依赖

使用 CommonsChunkPlugin 插件,将多个 js 文件进行提取,建立一个独立的文件。这个文件包含一些共用模块,浏这样览器只在刚开始的时候加载一次,便缓存起来供后续使用。而不用每次访问一个新界面时,再去加载一个更大的文件。

entry:{
 app:'./entry',
 vendor:['react','other-lib'],
 },
 plugins:[
 new Webpack.optimize.CommonsChunkPlugin({
   name: 'vendor',
 }),
 ]

开启gzip压缩

我们使用 compression-webpack-plugin 插件进行压缩。 安装: npm install compression-webpack-plugin --save-dev 。 compression-webpack-plugin 详细用法 使用:

const CompressionPlugin = require("compression-webpack-plugin");
plugins:[
new CompressionPlugin({
 asset: '[path].gz[query]', //目标资源名称。[file] 会被替换成原资源。[path] 会被替换成原资源路径,[query] 替换成原查询字符串
   algorithm: 'gzip',//算法
   test: new RegExp(
     '\\.(js|css)$'  //压缩 js 与 css
   ),
   threshold: 10240,//只处理比这个值大的资源。按字节计算
   minRatio: 0.8//只有压缩率比这个值小的资源才会被处理
})
]

压缩结果:

浅谈webpack打包之后的文件过大的解决方法

浅谈webpack打包之后的文件过大的解决方法

开启html压缩,自动添加上面生成的静态资源

添加插件 html-webpack-plugin

安装: npm install html-webpack-plugin --save-dev 用法:

plugins:[
 new HtmlWebpackPlugin({
   title: '',
     template: __dirname + '/../public/index.html',
     minify: {
       removeComments: true,
       collapseWhitespace: true,
       removeRedundantAttributes: true,
       useShortDoctype: true,
       removeEmptyAttributes: true,
       removeStyleLinkTypeAttributes: true,
       keepClosingSlash: true,
       minifyJS: true,
       minifyCSS: true,
       minifyURLs: true,
     },
     chunksSortMode:'dependency'
   }),
]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js String对象中常用方法小结(字符串操作)
Jan 27 Javascript
node.js中的fs.createWriteStream方法使用说明
Dec 17 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
Aug 05 Javascript
js内置对象处理_打印学生成绩单的简单实现
Sep 24 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
Dec 16 Javascript
JS实现间歇滚动的运动效果实例
Dec 22 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
Jan 19 Javascript
Vue Cli与BootStrap结合实现表格分页功能
Aug 18 Javascript
关于预加载InstantClick的问题解决方法
Sep 12 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
Sep 25 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
Dec 03 Javascript
layui表格数据复选框回显设置方法
Sep 13 Javascript
解决iview打包时UglifyJs报错的问题
Mar 07 #Javascript
React Native使用fetch实现图片上传的示例代码
Mar 07 #Javascript
使用vue制作探探滑动堆叠组件的实例代码
Mar 07 #Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
Mar 07 #Javascript
关于Vue的路由权限管理的示例代码
Mar 06 #Javascript
vue.js在标签属性中插入变量参数的方法
Mar 06 #Javascript
基于Vue中点击组件外关闭组件的实现方法
Mar 06 #Javascript
You might like
PHP中的串行化变量和序列化对象
2006/09/05 PHP
也谈 PHP 和 MYSQL
2006/10/09 PHP
php利用cookie实现访问次数统计代码
2011/05/19 PHP
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
PHP使用栈解决约瑟夫环问题算法示例
2017/08/27 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
php面向对象程序设计中self与static的区别分析
2019/05/21 PHP
一页面多XMLHttpRequest对象
2007/01/22 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
javascript实现连续赋值
2015/08/10 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
2016/05/13 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
JavaScript大数相加相乘的实现方法实例
2020/10/18 Javascript
原生JavaScript实现轮播图
2021/01/10 Javascript
Python正则表达式指南 推荐
2018/10/09 Python
Python多线程原理与用法实例剖析
2019/01/22 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
Python实现打砖块小游戏代码实例
2019/05/18 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
英国户外玩具儿童游乐设备网站:TP Toys(蹦床、攀爬框架、秋千、滑梯和游戏屋)
2018/04/09 全球购物
TCP/IP模型的分界线
2012/12/01 面试题
微型企业创业投资计划书
2014/01/10 职场文书
建筑工地门卫岗位职责
2014/04/30 职场文书
资助贫困学生倡议书
2014/05/16 职场文书
影子教师研修方案
2014/06/14 职场文书
学习雷锋标语
2014/06/25 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
中英文求职信范文
2015/03/19 职场文书
婚礼父母致辞
2015/07/28 职场文书
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis