广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Javascript代码是怎样被压缩的
  • 841
分享到

Javascript代码是怎样被压缩的

2024-04-02 19:04:59 841人浏览 泡泡鱼
摘要

javascript代码是怎样被压缩的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。随着前端的发展,特别是 React,Vue 等构造单页

javascript代码是怎样被压缩的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

随着前端的发展,特别是 ReactVue 等构造单页应用的兴起,前端的能力得以很大提升,随之而来的是项目的复杂度越来越大。此时的前端的静态资源也越来越庞大,而毫无疑问 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 在代码压缩中使用到的解析器是 UglifyJS。

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

Javascript代码是怎样被压缩的

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

Javascript代码是怎样被压缩的

UglifyJS

不要重复造轮子!

于是我找了一个久负盛名的关于代码压缩的库: UglifyJS3[4],一个用以代码压缩混淆的库。那它是如何完成一些压缩功能的,比如替换空白符,答案是 AST。

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

// 原始代码  const code = `const a = 3;`  // 通过 UglifyJS 把代码解析为 AST  const ast = UglifyJS.parse(code);  ast.figure_out_scope();  // 转化为一颗更小的 AST 树  compressor = UglifyJS.Compressor();  astast = ast.transform(compressor);  // 再把 AST 转化为代码  code = ast.print_to_string();

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

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

在 webpack 中压缩代码

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

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

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      })    ]  }

关于Javascript代码是怎样被压缩的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网JavaScript频道了解更多相关知识。

--结束END--

本文标题: Javascript代码是怎样被压缩的

本文链接: https://www.lsjlt.com/news/82563.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Javascript代码是怎样被压缩的
    Javascript代码是怎样被压缩的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。随着前端的发展,特别是 React,Vue 等构造单页...
    99+
    2022-10-19
  • Javascript代码是如何被压缩的
    今天就跟大家聊聊有关Javascript代码是如何被压缩的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。随着前端的发展,特别是 React,Vue ...
    99+
    2022-10-19
  • Oracle表的压缩是怎样的
    本篇文章为大家展示了Oracle表的压缩是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 随着数据库的增长,我们可以考虑使用or...
    99+
    2022-10-19
  • MS SQL SERVER 数据库日志压缩方法与代码是怎样的
    MS SQL SERVER 数据库日志压缩方法与代码是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。MSSQL性能是很不错的,但是数据库...
    99+
    2022-10-19
  • Linux压缩文件格式是怎样的
    这期内容当中小编将会给大家带来有关Linux压缩文件格式总结是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕。别个不说...
    99+
    2023-06-13
  • Webpack构建代码质量压缩的方法是什么
    这篇文章主要介绍“Webpack构建代码质量压缩的方法是什么”,在日常操作中,相信很多人在Webpack构建代码质量压缩的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2022-10-19
  • javascript被五整除的代码怎么写
    这篇文章主要介绍了javascript被五整除的代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇javascript被五整除的代码怎么写文章都会有所收获,下面我们一起来...
    99+
    2022-10-19
  • V8引擎是怎样执行JavaScript代码
    V8引擎是怎样执行JavaScript代码,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 题目中说到的V8引擎,大家自然会联想到No...
    99+
    2022-10-19
  • .Net Core 多文件打包压缩的实现代码怎么写
    本篇文章给大家分享的是有关.Net Core 多文件打包压缩的实现代码怎么写,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。最近项目需要实现多文件打包的功能,...
    99+
    2023-06-22
  • Java实现把文件压缩成zip文件的代码怎么写
    本篇内容主要讲解“Java实现把文件压缩成zip文件的代码怎么写”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java实现把文件压缩成zip文件的代码怎么写”吧!实现代码ackage ...
    99+
    2023-06-29
  • 十四个JavaScript的优化代码建议是怎样的
    今天就跟大家聊聊有关十四个JavaScript的优化代码建议是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JavaScript 已经成为当下...
    99+
    2022-10-19
  • 30秒就能理解的JavaScript优秀代码是怎样的
    今天就跟大家聊聊有关30秒就能理解的JavaScript优秀代码是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。今天要和大家分享一个项目,里面...
    99+
    2022-10-19
  • Javascript中递归函数的案例与代码是怎样的
    这篇文章给大家介绍Javascript中递归函数的案例与代码是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 一.递归函数的理解1、生活中的递归“递归”在生活中的一个典...
    99+
    2022-10-19
  • Python代码风格是怎样的
    小编给大家分享一下Python代码风格是怎样的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Python主要用来做什么Python主要应用于:1、Web开发;2、...
    99+
    2023-06-14
  • css代码顺序是怎么样的
    这篇文章主要为大家展示了“css代码顺序是怎么样的”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css代码顺序是怎么样的”这篇文章吧。 尽量按照特定顺序编写规...
    99+
    2022-10-19
  • JVM是怎样运行Java代码的
    这篇文章主要介绍“JVM是怎样运行Java代码的”,在日常操作中,相信很多人在JVM是怎样运行Java代码的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM是怎样运行Java代码的”的疑惑有所帮助!接下来...
    99+
    2023-06-03
  • AJAX类代码的用法是怎样的
    AJAX类代码的用法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 基本用法:  代码如下:va...
    99+
    2022-10-19
  • 8个写JavaScript代码小技巧是什么样的
    本篇文章为大家展示了8个写JavaScript代码小技巧是什么样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在编码时还需要保持代码整洁,平时注意积累在编码时所使...
    99+
    2022-10-19
  • MongoDB操作类PHP代码是怎样的
    MongoDB操作类PHP代码是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。<php include_once d...
    99+
    2022-10-18
  • 防止网站被攻击及DEDECMS代码的加固安全解决方案是怎样的
    防止网站被攻击及DEDECMS代码的加固安全解决方案是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。当中2个用dedecms做的公司网站,公司网站底端被直...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作