前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Webpack 4教程:为什么要优化代码

Webpack 4教程:为什么要优化代码

作者头像
葡萄城控件
发布于 2019-05-25 08:32:45
发布于 2019-05-25 08:32:45
55400
代码可运行
举报
运行总次数:0
代码可运行

转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://wanago.io/2018/07/30/webpack-4-course-part-five-built-in-optimization-for-production/

在本次Wepack 4教程,我们会聚焦通过压缩输出内容,来提升你应用的用户体验。这意味着,生产环境需要一套不同的做法。今天,我们将通过mode参数来讲述Webpack内置的优化功能。开始吧!

首先,让我们来回答究竟为什么要优化代码。如果你遵循良好的代码实践,你可能会致力于将代码写得容易阅读,所以你会添加很多空白符(tab、空格和空行)和注释。它让代码更好读,但也让文件变大了。另一方面,为了用户体验而牺牲可阅读性,这是不可取的。要在生产环境手动删除无用代码是非常繁琐的事情。因此,对这个问题已有了现成的解决方案,你可以在项目中拿来就用。

生产环境模式

mode是Webpack 4引入的一个参数。自此,就需要在配置中设置它。如果不配置它,会得到一个警告,并应用上默认值production。如果使用了mode: "produnction",Webpack会为你设置一些相关配置。因此,你的打包输出会更好地用于生产环境。我们会一步步学习它具体为我们做了什么事。

UglifyJsPlugin

mode设置为produnction会为我们的配置添加UglifyJsPlugin插件。它通过压缩代码让其更小和更快。从简单的任务,比如缩减你的变量名或者删除多余的空白,到删除冗余代码,它都能做到。默认情况下,它会解析每一个 .js 文件。我们会在本文介绍UglifyJsPlugin最基本的配置。虽然Webpack 4根据选择的mode为你做了优化,但你仍然可以通过optimization属性配置它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// webpack.config.js
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
  mode: "production",
  // 使用 mode: "production" 后会添加下面的配置:
  optimization: {
    minimize: true,
      minimizer: [
        new UglifyJsPlugin()
      ]
    },
};

你能传给UglifyJsPlugin的最重要的属性叫做uglifyOptions。它有许多默认的配置。其中一个最值得注意的部分是compress属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// webpack.config.js
new UglifyJsPlugin({
  uglifyOptions: {
    compress: {
      /*(...)*/
    }
  } 
});

它负责配置UglifyJsPlugin所做的许多重量级工作,以让你的代码更精简。你可以在官方列表查看完整的可用配置。它也有一些默认值。

另一个UglifyJsPlugin配置的重要属性是output

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new UglifyJsPlugin({
  uglifyOptions: {
    compress: {
      /*(...)*/
    },
    output: {
      /*(...)*/
    }
  }
})

默认情况下,输出的代码会尽可能的简短。你可以配置output来改变这种行为。你可能不会想要修改大部分的默认配置,但是有一个值得考虑的属性是drop_console,它默认设置为false。把它改为true将会去除所有的console.log调用。若想了解更多关于output的配置,请查看完整列表

UglifyJsPlugin有很多可选配置。你可以在Github上的文档里看到所有这些。

DefinePlugin

这个插件允许你在编译时创建全局常量。如果你使用mode: "produnction",Webpack会默认设置上: "process.env.NODE_ENV": JSON.stringify("produnction")。  

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// webpack.config.js
module.exports = {
  mode: "production",
  // 使用 mode: "production" 会添加以下内容:
  plugins: [
    new webpack.DefinePlugin({
      "process.env.NODE_ENV": JSON.stringify("production")
    }),
  ]
}

注意,由于是纯文本的替换,传给此属性的值必须用引号括起来。它可以通过JSON.stringify("produnction")或者'"produnction"'实现。

编译时解析它,意味着如果你在代码中使用了process.env.NODE_ENV,它将会被替换为"produnction"。  

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log(process.env.NODE_ENV);
if(process.env.NODE_ENV === 'production') {
  console.log('this is production!');
}

请记住,process.env.NODE_ENV的值在编译之后不会被保留。使用Webpack处理上面的代码,会得到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log("production");
if(true) {
  console.log("this is production!");
}

在经过UglifyJsPlugin的最小化处理之后,它得到简化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log("production");
console.log("this is production!");

NoEmitOnErrorsPlugin

这个插件会帮你处理编译时的错误。例如,你可能会尝试导入Webpack不能解析的某个文件。在这种情况下,Webpack会为应用创建一个包含错误信息的版本。使用NoEmitOnErrorsPlugin插件后,这个错误信息版本根本就不会被创建。  

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// webpack.config.js
const webpack = require('webpack');

module.exports = {
  mode: "produnction",
  // 使用mode: produnction,会添加如下的配置
  plugins: [
    new webpack.NoEmitOnErrorsPlugin()
  ]
}

ModuleConcatenationPlugin

默认情况下,Webpack创建单独的闭包来包含每个模块。这个包裹函数会轻微地减缓你代码的运行速度。请看这个例子:  

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// one.js
const dog = 'Fluffy';
export const one = 1;
// two.js
const dog = 'Fluffy';
export const two = 2;
// index.js
import { one } from './one';
import { two } from './two';
const dog = 'Fluffy';

console.log(one, two);

如果没有ModuleConcatenationPlugin,输出的包看起来像这样:  

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// main.js
(function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _one__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
/* harmony import */ var _two__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);

const dog = 'Fluffy';

console.log(_one__WEBPACK_IMPORTED_MODULE_0__["one"], _two__WEBPACK_IMPORTED_MODULE_1__["two"]);

/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "one", function() { return one; });
const dog = 'Fluffy';
const one = 1;


/***/ }),
/* 2 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "two", function() { return two; });
const dog = 'Fluffy';
const two = 2;

/***/ })
/******/ ]);

当你把mode设为production,此插件就开始工作了。这样一来,输出的包现在都在一个scope里了。更少的函数意味着更少的运行时开销。

注意,我在这个例子中没有使用任何优化配置。由于优化器其实已经知道模块之间的内部依赖,它能更好地完成任务。  

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// main.js
(function(module, __webpack_exports__, __webpack_require__) {

"use strict";

// 串起来的模块: ./src/one.js
const dog = 'Fluffy';
const one = 1;

// 串起来的模块: ./src/two.js
const two_dog = 'Fluffy';
const two = 2;
// 串起来的模块: ./src/index.js

const src_dog = 'Fluffy';

console.log(one, two);
/***/ })
/******/ ]);

如果你觉得感兴趣,可查看webpack博客上的这篇文章,它对此给出了更多信息。

总结

今天我们学习了Webpack能通过设置mode: "produnction"做的内置优化。这能使你的应用加载更快,性能更好。它通过配置一系列打包流程,以满足你生产环境的要求。本教程的下一部分,我们将介绍modedevelopment配置。敬请期待!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
显微镜下的webpack4的新特性:mode详解
webpack4支持的一个新特性就是zero配置,不需要config,也可以打包,这对于懒癌患者很有诱惑力,但是这也意味着我们不清楚零配置发生了写什么,也不知道打包出来的文件是否符合我们的心意,全部都是佛系打包。不过作为项目的亲爹亲妈,还是要对自己的孩子负责,每个打包过程都是要可控的。本文就是详解不同mode下,webpack打包都发生了些什么事。
小美娜娜
2019/04/04
8990
Webpack 4教程 - 第七部分 减少打包体积与Tree Shaking
在本次Webpack 4教程中,我们会更进一步讲述项目优化。我们会学习什么是tree shaking以及如何使用它。你会找到让Webpack 4中tree shaking运作起来所需要的东西,并知道怎样从中受益。开始吧!
葡萄城控件
2019/05/25
9610
前端-Webpack 之 treeShaking
在 github 上直接观看 markdown 会把图片转存到缓存中,github 转存后的图片清晰度很有问题,因此如果图片看不清,可以移步知乎上的相同文章
grain先森
2019/03/29
6560
前端-Webpack 之 treeShaking
Webpack揭秘——走向高阶前端的必经之路
随着前端工程化的不断发展,构建工具也在不断完善。作为大前端时代的新宠,webpack渐渐成为新时代前端工程师不可或缺的构建工具,随着webpack4的不断迭代,我们享受着构建效率不断提升带来的快感,配置不断减少的舒适,也一直为重写的构建事件钩子机制煞费苦心,为插件各种不兼容心灰意冷,虽然过程痛苦,但结果总是美好的。经历了一番繁琐的配置后,我常常会想,这样一个精巧的工具,在构建过程中做了什么?我也是抱着这样的好奇,潜心去翻阅相关书籍和官方文档,终于对其中原理有所了解,那么现在,就让我们一起来逐步揭开webpack这个黑盒的神秘面纱,探寻其中的运行机制吧。
疯狂的技术宅
2019/03/27
6140
Webpack揭秘——走向高阶前端的必经之路
Webpack揭秘——走向高阶前端的必经之路
随着前端工程化的不断发展,构建工具也在不断完善。作为大前端时代的新宠,webpack渐渐成为新时代前端工程师不可或缺的构建工具,随着webpack4的不断迭代,我们享受着构建效率不断提升带来的快感,配置不断减少的舒适,也一直为重写的构建事件钩子机制煞费苦心,为插件各种不兼容心灰意冷,虽然过程痛苦,但结果总是美好的。经历了一番繁琐的配置后,我常常会想,这样一个精巧的工具,在构建过程中做了什么?我也是抱着这样的好奇,潜心去翻阅相关书籍和官方文档,终于对其中原理有所了解,那么现在,就让我们一起来逐步揭开webpack这个黑盒的神秘面纱,探寻其中的运行机制吧。
IMWeb前端团队
2019/12/03
4970
Webpack揭秘——走向高阶前端的必经之路
显微镜下的webpack4入门
前端的构建打包工具很多,比如grunt,gulp。相信这两者大家应该是耳熟能详的,上手相对简单,而且所需手敲的代码都是比较简单的。然后webpack的出现,让这两者打包工具都有点失宠了。webpack比起前两者打包工具,对于前端程序员JS编程能力的要求还是挺高的。不过需要兼容ie8及以下的小伙伴们,就不要考虑webpack了,他很傲娇地不兼容!
小美娜娜
2019/04/04
6580
显微镜下的webpack4入门
了不起的 Webpack Scope Hoisting 学习指南
Scope Hoisting 是 webpack3 的新功能,直译为 "作用域提升",它可以让 webpack 打包出来的代码文件更小,运行更快。
pingan8787
2020/07/12
5340
了不起的 Webpack Scope Hoisting 学习指南
webpack4.0各个击破(5)—— Module篇
使用webpack对脚本进行合并是非常方便的,因为webpack实现了对各种不同模块规范的兼容处理,对前端开发者来说,理解这种实现方式比学习如何配置webpack更为重要,本节的内容实用性较低。
大史不说话
2018/09/10
6250
webpack4.0各个击破(5)—— Module篇
webpack打包原理入门探究(五)loader初探(一)
添加 webpack.app.config.js 文件, 配置 module, 用于加载 loader
公众号---人生代码
2020/06/04
6970
聊一聊面试中经常被问到的Tree Shaking
天下武功,唯快不破!最新版的 antd 以及 vue 都对 Tree Shaking 提供了支持。我们内部的组件在支持这部分功能时,也专门梳理了相关的特性。这是四月份写的文章了,长时间不用就会忘,复习一下!
前端迷
2020/08/28
2.1K0
聊一聊面试中经常被问到的Tree Shaking
揭秘webpack5模块打包
​在上一节中我们初步了解了webpack可以利用内置静态模块类型(asset module type)来处理资源文件,我们所知道的本地服务,资源的压缩,代码分割,在webpack构建的工程中有一个比较显著的特征是,模块化,要么commonjs要么esModule,在开发环境我们都是基于这两种,那么通过webpack打包后,如何让其支持浏览器能正常的加载两种不同的模式呢?
Maic
2022/07/28
9630
揭秘webpack5模块打包
webpack学习笔记
原始开发模式各种js文件引入,顺序不能乱,引入的数据太大,各种js之间有关联,可以考虑所有文件复制到一个js文件里,但又有作用域问题、文件太大、可维护性差
kif
2023/02/27
2770
webpack学习笔记
《Webpack实战 入门、进阶与调优(第2版)》- 第一章 webpack简介之打包代码分析
用户6256742
2024/06/22
2070
《webpack5 实战四》之loader
webpack 的loader 基础作用相当于一个项目插件,能够将指定文件统一的处理,是一个函数,相当于源码经过这个函数,出去变成了想要的目标。
星宇大前端
2022/03/09
8310
《webpack5 实战四》之loader
webpack模块化的原理
在webpack中既可以书写commonjs模块也可以书写es模块,而且不用考虑浏览器的兼容性问题,我们来分析一下原理。
gogo2027
2022/10/31
5400
【Webpack】241-Webpack 是怎样运行的?
在平时开发中我们经常会用到Webpack这个时下最流行的前端打包工具。它打包开发代码,输出能在各种浏览器运行的代码,提升了开发至发布过程的效率。
pingan8787
2019/07/25
8700
【Webpack】241-Webpack 是怎样运行的?
Webpack 性能系列五:使用 Scope Hoisting
默认情况下,经过 Webpack 打包后的模块资源会被组织成一个个函数形式,例如:
Tecvan
2021/12/09
1.5K0
手把手教你撸一个简易的 webpack
随着前端复杂度的不断提升,诞生出很多打包工具,比如最先的grunt,gulp。到后来的webpack和Parcel。但是目前很多脚手架工具,比如vue-cli已经帮我们集成了一些构建工具的使用。有的时候我们可能并不知道其内部的实现原理。其实了解这些工具的工作方式可以帮助我们更好理解和使用这些工具,也方便我们在项目开发中应用。
muwoo
2018/06/11
1.2K1
手把手教你撸一个简易的 webpack
webpack模块化
esModule通过该方法定义模块,重点在getter函数,通过闭包实现了esModule的特性:引用
tinyant
2022/11/16
4130
webpack启动代码源码解读
虽然每天都在用webpack,但一直觉得隔着一层神秘的面纱,对它的工作原理一直似懂非懂。它是如何用原生JS实现模块间的依赖管理的呢?对于按需加载的模块,它是通过什么方式动态获取的?打包完成后那一堆/******/开头的代码是用来干什么的?本文将围绕以上3个问题,对照着源码给出解答。
Dickensl
2022/06/14
7430
webpack启动代码源码解读
相关推荐
显微镜下的webpack4的新特性:mode详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验