Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
那些javascript前端构建工具说“什么?”;编撰;我的js代码?_Javascript_Webpack_Frontend_Babeljs - Fatal编程技术网

那些javascript前端构建工具说“什么?”;编撰;我的js代码?

那些javascript前端构建工具说“什么?”;编撰;我的js代码?,javascript,webpack,frontend,babeljs,Javascript,Webpack,Frontend,Babeljs,我看到那些javascript前端构建工具,例如webpack,不时使用“compile”这个词。我不确定编译javascript代码到底意味着什么,至少不像编译c/c++代码那样 我想我大体上理解“构建”过程,比如将所有js代码捆绑到一个大文件中,缩小/丑化代码,使用babel转换ES6语法()。但是编译在这里意味着什么,它如何适应整个构建过程,或者它只是整个构建过程的另一个名称 目前,我认为它可能只是使用Babel转换ES6语法的另一个名称 在读了这篇文章之后,我相信我的问题和那个不一样。因

我看到那些javascript前端构建工具,例如webpack,不时使用“compile”这个词。我不确定编译javascript代码到底意味着什么,至少不像编译c/c++代码那样

我想我大体上理解“构建”过程,比如将所有js代码捆绑到一个大文件中,缩小/丑化代码,使用babel转换ES6语法()。但是编译在这里意味着什么,它如何适应整个构建过程,或者它只是整个构建过程的另一个名称

目前,我认为它可能只是使用Babel转换ES6语法的另一个名称

在读了这篇文章之后,我相信我的问题和那个不一样。因为它不仅仅与巴布尔有关。例如,webpack还使用了术语compiler,我不理解它在那里的含义


Browserify也使用编译器,例如,“在Browserify转换中将HTML脚本标记中的下划线模板编译为CommonJS”

您几乎一针见血。当JavaScript项目上发生编译(或者更恰当地说是透明)操作时,它可能意味着很多事情。正如您所提到的,这些可能包括缩小、应用多边形填充、垫片或将脚本“编译”到单个捆绑文件中以供平台/浏览器使用的文字行为

使用JavaScript语言的超集(如TypeScript、ActionScript或UnityScript)时的Transpilation描述了将源x脚本转换回本地JavaScript的过程,而本地JavaScript又可以由浏览器进行解释(因为浏览器无法识别超集语言)


然而,你是绝对正确的。我们并没有将JavaScript编译成二进制,但是这个术语被大量使用,这可能会导致混淆。综上所述,我们正在接近采用WebAssembly和ASMJs的时代,这将带来在浏览器中运行字节码的时代,这将带来一些有趣的可能性,但遗憾的是。。。这是另一天的故事;)

最好将这个过程描述为“透明化”

Javascript总是在特定的环境中执行:在Chrome和Electron中,它是V8引擎;在Firefox中,它是SpiderMonkey;这些引擎中的每一个都支持一组特定的语言功能,而不是其他的。例如,一些引擎只支持
var
,不支持
const
let
。一些支持
异步
/
等待
,而另一些只支持
承诺

但是web开发人员知道这些其他特性,并且他们想要使用它们,即使是在为不支持这些特性的引擎编写时。为什么?大多数新的语言特性的设计目标是使复杂的概念能够以更简单、更清晰的方式表达。这一点非常重要,因为代码的首要任务是明确其目的。

因此,大多数语言特性本质上是现有功能的语法糖。在这些情况下,总是可以使用新语法和旧语法来表示例程。这是合乎逻辑的必然

像Babel这样的transpiler可以读取使用高级语法编写的脚本,然后使用一组受限的语言功能重新表达脚本。依靠称为抽象语法树的中间表示,它可以生成保证功能等效的代码,即使它使用非常不同、支持范围更广的控制结构进行工作

也许我们web开发人员在术语方面变得懒惰了。当我们谈论“编译”javascript时,我们通常不会谈论将脚本转换为字节码之类的东西。我们说的是脱毛


其他类型的构建任务也变得相当普遍。如今,前端痴迷于各种各样的“模板化”,因为使用纯javascript描述DOM更改非常繁琐和混乱,而且应用程序的复杂性也在快速增长。有些框架要求您将源代码转换为其他中间形式,这些中间形式稍后由web应用程序在运行时使用。其他人则允许开发者使用发明的语法来描述用户界面,而浏览器甚至都不支持这种语法。所需的任务因应用程序而异,具体取决于所使用的框架、应用程序体系结构的细节以及部署环境的轮廓,这只是一个开始

在其基础上,使用HTML、CSS和JavaScript构建网页。这一点没有改变。但今天,大多数严肃的应用程序几乎完全是用javascript(或非常类似的东西)和sass构建的。构建应用程序是将一组转换应用于源代码以生成这三种基本语言的最终工件的过程


我们把所有这些东西都归为“编译”一词。

你说得对,这些前端Javascript工具在与C/C++等语言的构建工具相同的上下文中没有使用“编译”一词。C/C++编译器将源代码转换为机器代码

这些JavaScript构建工具——比如Webpack——在某种意义上使用了compile这个词,这比传统的更具隐喻性


当web构建工具使用compile这个词时,他们使用这个词的意义是,他们正在传输、缩小(也称为uglyzing)和捆绑源文件,以便更好地针对客户端浏览器和网络请求进行优化。(更小的文件大小、更好的浏览器兼容性、来自捆绑资产的HTTP请求更少等)

可能重复@Yangsun Tay,这不是重复的问题。查看我的更新。到目前为止,我得到的所有答案中,您的答案是最好的,因此我将您的答案标记为接受。Th