javascript 代码是如何被压缩的

访客4年前关于黑客接单972

这是山月关于高级前端进阶暨前端工程系列文章的第 M 篇文章 (M 随便打的,究竟也不知道能写若干篇),关于前 M-1 篇文章,可以从我的 github repo shfshanyue/blog 中找到,若是点进去的话可以捎带~点个赞~,若是没有点进去的话,那就给这篇文章点个赞。。今天的文章更先了

本篇文章地址在 前端工程化系列,迎接订阅。

随着前端的生长,特别是 React,Vue 等组织单页应用的兴起,前端的能力得以很大提升,随之而来的是项目的复杂度越来越大。此时的前端的静态资源也越来越重大,而毫无疑问 javascript 资源已是前端的主体资源,对于压缩它的体积至为主要。

为什么说更小的体积很主要呢:更小的体积对于用户体验来说意味着更快的加载速率以及更好的用户体验,这也能早就企业更大的利润。另外,更小的体积对于服务器来说也意味更小的带宽以及更少的服务器用度。

前端构建编译代码时,可以使用 webpack 中的 optimization.minimizer 来对代码举行压缩优化。然则我们也需要领会若何它是压缩代码的,这样当在生产环境的控制台调试代码时对它也有更深刻的明白。


若何查看资源的体积

对于我们所编写的代码,它在操作系统中是一个文件,凭据文件系统中的 stat 信息我们可以查看该文件的巨细。

stat 下令用来打印文件系统的信息:

$ stat config.js
  File: ‘config.js’
  Size: 3663            Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 806060      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-02-13 13:43:54.851381702 +0800
Modify: 2020-02-13 13:43:52.668417641 +0800
Change: 2020-02-13 13:43:52.691417262 +0800
 Birth: -

stat 打印的信息过大,若是只用来权衡体积,可以使用 wc -c

$ wc -c config.js
3663 config.js


若何压缩代码体积?

去除多余字符: 空格,换行及注释

// 对两个数求和
function sum (a, b) {
  return a + b;
}

先把一个抽象的问题给具体化,若是是以上一段代码,那若何压缩它的体积呢:

此时文件巨细是 62 Byte, 一般来说中文会占用更大的空间。

多余的空缺字符会占用大量的体积,如空格,换行符,另外注释也会占用文件体积。当我们把所有的空缺相符注释都去掉之后,代码体积会获得削减。

去掉多余字符之后,文件巨细已经变为 30 Byte。 压缩后代码如下:

function sum(a,b){return a+b}

替换掉多余字符后会有什么问题发生呢?

有,好比多行代码压缩到一行时要注意行尾分号。 这就需要通过以下先容的 AST 来解决。

压缩变量名:变量名,函数名及属性名

function sum (first, second) {
  return first + second;  
}

如以上 first 与 second 在函数的作用域中,在作用域外不会引用它,此时可以让它们的变量名称更短。然则若是这是一个 module 中,sum 这个函数也不会被导出呢?那可以把这个函数名也缩短。

// 压缩: 缩短变量名
function sum (x, y) {
  return x + y;  
}

// 再压缩: 去除空余字符
function s(x,y){return a+b}

在这个示例中,当完成代码压缩 (compress) 时,代码的混淆 (mangle) 也捎带完成。 但此时缩短变量的命名也需要 AST 支持,不至于在作用域中造成命名冲突。

更简朴的表达:合并声明以及布尔值简化

合并声明的示例如下:

// 压缩前
const a = 3;
const b = 4;

// 压缩后
const a = 3, b = 4;

布尔值简化的示例如下:

// 压缩前
!b && !c && !d && !e

// 压缩后
b||c||d||e

这个示例更是需要剖析 AST 了

AST

AST,抽象语法树,js 代码剖析后的最小词法单米,而这个历程就是通过 Parser 来完成的。

那么 AST 可以做什么呢?

  • eslint: 校验你的代码气概
  • babel: 编译代码到 ES 低版本
  • taro/mpvue: 种种可以多端运行的小程序框架
  • GraphQL: 剖析客户端查询

我们在一样平常事情中经常会不经意间与它打交道,如 eslint 与 babel,都市涉及到 js 与代码中游走。差别的剖析器会天生差别的 AST,司空见惯的是 babel 使用的剖析器 babylon,而 uglify 在代码压缩中使用到的剖析器是 Uglify *** 。

你可以在 AST Explorer 中直观感受到,如下图:

那压缩代码的历程:code -> AST -> (transform)一颗更小的AST -> code,这与 babel 和 eslint 的流程一模一样。


Uglify ***

不要重复造轮子!

于是我找了一个久负盛名的关于代码压缩的库: Uglify *** 3,一个用以代码压缩混淆的库。那它是若何完成一些压缩功效的,好比替换空缺符,谜底是 AST。

webpack 中内置的代码压缩插件就是使用了它,它的事情流程大致如下:

// 原始代码
const code = `const a = 3;`

// 通过 Uglify ***  把代码剖析为 AST
const ast = Uglify *** .parse(code);
ast.figure_out_scope();


// 转化为一颗更小的 AST 树
compressor = Uglify *** .Compressor();
ast = ast.transform(compressor);

// 再把 AST 转化为代码
code = ast.print_to_string();

而当你真正使用它来压缩代码时,你只需要面向设置编程即可,文档参考 uglify 官方文档

{
  {
    ecma: 8,
  },
  compress: {
    ecma: 5,
    warnings: false,
    comparisons: false,
    inline: 2,
  },
  output: {
    ecma: 5,
    comments: false,
    ascii_only: true,
  }
}


在 webpack 中压缩代码

在知道代码压缩是怎么完成的之后,我们终于可以把它搬到生产环境中去压缩代码。终于到了实践的时刻了,虽然它只是简朴的挪用 API 而且调调参数。

一切与性能优化相关的都可以在 optimization 中找到,TerserPlugin 是一个底层基于 uglifyjs 的用来压缩 *** 的插件。

optimization: {
  minimize: isEnvProduction,
  minimizer: [
    new TerserPlugin({
      terserOptions: {
        parse: {
          ecma: 8,
        },
        compress: {
          ecma: 5,
          warnings: false,
          comparisons: false,
          inline: 2,
        },
        output: {
          ecma: 5,
          comments: false,
          ascii_only: true,
        },
      },
      sourceMap: true
    })
  ]
}
思源资源网:分类流动

1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入

相关文章

葫芦娃合星要多少碎片

  1、合星需要1-7娃全部到达5星。(前置条件,必需是所有娃都到五星,不然不会呈现合星提示)2、呈现合星提示后,凑齐想要合星的某一个娃娃的500碎片即可合星(只...   1-7娃,全部五星,就可以...

搬新家有什么讲究?新房搬家的讲究有哪些?看好再搬别弄错了

搬新家有什么讲究?新房搬家的讲究有哪些?看好再搬别弄错了

通风结束后最激动人心的就是搬进新家,但是老黄历上还显示着搬家迁移的宜忌事项,因此在这方面还是要多加注意,那么搬家的讲究有哪些呢? 搬家的讲究和忌讳 1、首先搬家要挑选一个吉日适合搬家的吉日,现...

美国绿卡是什么意思?美国绿卡和美国国籍是一

美国绿卡是什么意思?美国绿卡和美国国籍是一

绿卡持有人不是美国公民,但可以永久居住美国,绿卡的待遇和美国国籍是一样的,只不过没有任何政治权利。 对于今天的国人来说,移民已经不是一个陌生的词汇了,我们周围或多或少的都有一些亲戚朋友移民到海外,其...

微信怎么定位好友的位置又不被他发现呢(偷偷获取微信好友位置)

微信怎么定位好友的位置又不被他发现呢 微信是咱们生存中多见的社群和交换对象。 上头的很多功效都值得一试。 好比咱们本日所说的定位功效,即是一个很...

黑客通过微信号查信息(黑客盗微信号)

黑客通过微信号查信息(黑客盗微信号)

     微信更是独树一帜,到目前为止,微信的活跃用户已经达到12亿,远远超过他们的"前任"QQ。同时,也给腾讯带来了很多问题,毕竟太多的用户会混合在一起,这是无法控制的。      然而,腾讯最近正...

你的个人信息可能是这样泄露的!黑客从电商平台 偷200万条个人信息被抓

你知道你的网购信息如何泄露的吗?也许它们是被黑客从电商那里偷走的。近日,重庆江北警方破获一起跨国黑客案,成功抓获四名利用技术手段盗取他人购买信息数据的犯罪嫌疑人。短短一个多月时间,他们竟盗取了200多...