浅谈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 相关文章推荐
setTimeout的延时为0时多个浏览器的区别
May 23 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
Sep 27 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
Jan 03 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
Mar 21 Javascript
浅析ES6的八进制与二进制整数字面量
Aug 30 Javascript
JS实现的RGB网页颜色在线取色器完整实例
Dec 21 Javascript
解决iview打包时UglifyJs报错的问题
Mar 07 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
Sep 14 Javascript
写gulp遇到的ES6问题详解
Dec 03 Javascript
JavaScript中break、continue和return的用法区别实例分析
Mar 02 Javascript
Node.js API详解之 dgram模块用法实例分析
Jun 05 Javascript
jQuery实现异步上传一个或多个文件
Aug 17 jQuery
解决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简单浏览目录内容的实现代码
2013/06/07 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
php实现基于PDO的预处理示例
2017/03/28 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
Python中运行并行任务技巧
2015/02/26 Python
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
python 3.6.2 安装配置方法图文教程
2018/09/18 Python
Python3中列表list合并的四种方法
2019/04/19 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
python SOCKET编程基础入门
2021/02/27 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
Bibloo荷兰:女士、男士和儿童的服装、鞋子和配饰
2019/02/25 全球购物
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
工程师求职简历的自我评价分享
2013/10/10 职场文书
服装创业计划书范文
2014/02/05 职场文书
应聘文员自荐信范文
2014/03/11 职场文书
奠基仪式主持词
2014/03/20 职场文书
完美的中文自荐信
2014/05/24 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
导游词之广东佛山(南风古灶)
2019/09/24 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL