我有一个Node.js项目,想要使用Closure Compiler进行编译。我不想在浏览器中运行/使用browserify。我主要想要类型检查的效用。我最初使用以下方式使编译器正常工作:
java -jar compiler.jar -W VERBOSE
--language_in ECMASCRIPT5_STRICT
--externs closure-externs.js
--js="lib/**.js"
在 closure-externs.js
中手动定义了变量和函数,我以相对粗糙的方式从 Node.js 中使用它们:
// closure-externs.js
/** @constructor */function Buffer(something){}
function require(path){}
var process = {};
[...]
结果发现这只是纯粹的运气。文件之间没有依赖追踪,所以有些情况下你可能返回一个类型{Foo}
,编译器会抱怨它不存在(取决于机器,取决于编译顺序)。后来我发现自己全部做错了,应该使用--process_common_js_modules
,这样编译器就会在需要时进行依赖追踪,比如我require("foo")
。我当前这样调用编译器:
java -jar compiler.jar -W VERBOSE
--language_in ECMASCRIPT5_STRICT
--externs externs/fs.js
--js="lib/**.js"
--process_common_js_modules
--common_js_entry_module app.js
但是出现了以下错误:
ERROR - required entry point "module$crypto" never provided
ERROR - required entry point "module$dgram" never provided
ERROR - required entry point "module$extend" never provided
ERROR - required entry point "module$fs" never provided
ERROR - required entry point "module$net" never provided
ERROR - required entry point "module$q" never provided
一些模块是 Node.js 本地模块 (例如 fs
),而其他模块包含在 node_modules
中,如 q
。我不想通过编译器运行这些外部模块,所以我知道需要为它们设置 externs
文件。我知道有一个 https://github.com/dcodeIO/node.js-closure-compiler-externs 用于常见的 Node.js externs,并且我知道如何在编译器上调用它们,但出现了像 --externs externs/fs.js
的错误,module$fs
仍然存在问题。我做错了什么?我知道还有其他标志,如
--module
和 --common_js_module_path_prefix
,但我不确定是否需要使用它们才能使其正常工作。我无法通过搜索获得任何正确的答案。 :(
compiler.jar
正确使用这些文件,因为--externs
似乎并没有像我想的那样工作。 - Dororo