Javascript 如何使用Google';s闭包编译器?

Javascript 如何使用Google';s闭包编译器?,javascript,minify,google-closure-compiler,Javascript,Minify,Google Closure Compiler,我想在我们正在使用的javascript源代码上使用google闭包编译器。 在开发模式中,我们倾向于将功能分解为许多文件,但对于生产,我们希望将它们组合成模块 当调用编译器时,我可以给它一个要包含的文件列表以供编译,但是它的输出显示编译器没有保存文件列表的顺序 我搜索了一下,发现我可以使用goog.provide/good.require来控制不同js文件之间的依赖关系。 问题是,它向我的js中添加了我不需要或不想要的代码,例如: goog.provide("mainFile") 将添加以下

我想在我们正在使用的javascript源代码上使用google闭包编译器。 在开发模式中,我们倾向于将功能分解为许多文件,但对于生产,我们希望将它们组合成模块

当调用编译器时,我可以给它一个要包含的文件列表以供编译,但是它的输出显示编译器没有保存文件列表的顺序

我搜索了一下,发现我可以使用goog.provide/good.require来控制不同js文件之间的依赖关系。 问题是,它向我的js中添加了我不需要或不想要的代码,例如:

goog.provide("mainFile")
将添加以下内容:

var mainFile = {};
对于已编译的js文件,我不想要的东西。 我们根本不使用google闭包库,我只想使用编译器

有没有一种方法可以告诉编译器文件的顺序,而不包括我不需要的更多“闭包库”功能? 当然,我可以创建一个自己的工具,它将首先获取所有文件,将它们合并成一个文件,然后作为编译器的输入,但是如果可以由编译器自己完成,我更愿意将其作废


编辑 我们的目标是能够生成与此线程中的答案类似的模块:

所以我想增加一个功能,控制哪些文件进入哪个模块,同时控制它们的顺序。 目前我不使用通配符,但我计划将来使用(如果可能的话)

简单地说“cat file1.js file2.js>combined.js&&compile…”就可以了,但在我们的例子中,它有点复杂,我们必须根据一些逻辑编写一个程序/脚本来实现这一点。 如果我们能以某种方式告诉编译器文件的高级顺序,它可能只会节省实现这样一个程序的时间


谢谢。

Close编译器创建多个输出文件的能力提供了一个强大的工具,可以将输入文件分离为不同的输出块。它的设计使得根据所需的特性,可以在不同的时间加载不同的块。有多个编译器标志与块有关

--chunk标志的每次使用都描述了一个输出文件及其依赖项。每个区块标志遵循以下语法:

--js inputfile.js
--chunk name:num_files:dependency
生成的输出文件将是name.js,包括前面的--js标志指定的文件

依赖项选项是您最感兴趣的。它指定父块是什么。区块选项必须描述有效的依赖关系树(您必须有一个基本区块)

下面是一个例子:

--js commonfunctions.js
--chunk common:1
--js page1functions.js
--js page1events.js
--chunk page1:2:common
--js page2function.js
--chunk page2:1:common
--js page1addons.js
--chunk page1addons:1:page1
在本例中,您告诉编译器page1和page2块依赖于公共块,page1addons块依赖于page1块

请记住,如果编译器确定代码仅由一个块使用,那么它可以并且确实会将代码从一个块移动到其他块输出文件中

所有这些都不需要闭包库或使用goog.require/provide调用,也不向输出中添加任何代码。如果您希望编译器自动确定依赖项或能够为您管理这些依赖项,则需要使用模块格式,如CommonJS、ES2015 modules或goog.require/provide/module calls

更新说明:在20180610版本之前,
标志被命名为
模块
。它们被重命名,以减少与正确的JS模块的混淆。答案已更新,以反映新名称


更新说明2:他们现在是一个为您自动计算和生成这些标志的实用工具:

您还可以设置输出路径,例如:

--模块\输出\路径\前缀。/public/js/

另见:

关于
cat file1 file2>temp和compile-js temp
如何?调用编译器时,您是使用通配符(*.js)还是按顺序声明每个文件?我编辑了我的问题,因为它太大,无法发表评论。谢谢。控制顺序是指编译器在给定模块中处理每个源文件的顺序吗?它应该是你列出它们的顺序。如果将相同的源文件编译成一个大文件有效,那么你应该在上发布一个问题。无论哪种方式,如果你能提供一个可复制的样品,这都会有所帮助。这是一个很好的简明答案,并附有一个很好的例子。完美的在测试您的答案时,我无法创建名称中包含句点或破折号的模块。这是可能的,还是我做错了什么?示例:
--模块common.min:1
对我不起作用。(当我说不起作用时,我的意思是没有创建任何模块。)我在我的博客中写了一个简单的例子来说明如何做到这一点。共享以防其他人感兴趣:如何为生成的模块创建源映射?这适用于显式指定的.js文件,但在从入口点使用自动依赖性检查时又如何?你能为一组依赖项指定一个模块吗?当你有一个以上的依赖项时呢?