当前位置: 首页 > 面试题库 >

如何在Closure Compiler中将node_modules定义为externs?

卫英悟
2023-03-14
问题内容

我有一个要使用Closure
Compiler编译的Node.js项目。我不希望它在浏览器中运行/使用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因此编译器将在I进行依赖项跟踪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_moduleslike中q。我不想通过编译器运行这些外部模块,所以我知道我需要externs为它们设置文件。我知道对于常见的Node.js
externs 有https://github.com/dcodeIO/node.js-closure-compiler-
externs,我知道如何在编译器上调用它们,但是由于某些原因,当我执行类似操作时--externs externs/fs.js错误module$fs仍然存在。我究竟做错了什么?

我知道还有其他类似的标志--module--common_js_module_path_prefix但是我不确定是否需要使用它们来使它正常工作。我的Google-
fu无法在此处针对正确的咒语提出任何答案。:(


问题答案:

问题是您希望编译器以某种方式认识到某些require调用是内部的,即所需的模块应由编译器作为源进行处理,而其他模块是外部的,因此应单独放置。当前没有一个很好的方法来处理这种情况。

使用后处理添加外部Require语句

在这种情况下,您将完全省略require对外部模块的任何语句。编译器只会处理带有内部require语句和模块的代码。编译之后,您可以在外部require语句之前添加:

标头JS将被添加

var crypto = require('crypto');

代码要编译

console.log(crypto);

因为crypto是在外部声明的,所以编译器将正确识别类型和符号名称。

别名需要通话

--process_common_js_modules指定时,编译器可以识别require的语句,并以类似的方式扩大他们的宏在其他语言的工作方式。通过别名化require应保留在外部的语句,编译器将无法识别它们,因此不会展开它们。

源代码要编译

var externalRequire = require;
/** @suppress {duplicate} this is already defined in externs */
var crypto = externalRequire('crypto');
console.log(crypto)


 类似资料:
  • 我需要这样的东西: 当然,我认为只有内置数字类型的向量才能传递给函数。 编译器告诉我,我需要为Vec提供FromIterator的trait trait

  • 我使用的是npm版本5.4。2,我有一些node_模块,现在是3。x npm模块行为是指在包中未定义节点\模块目录中的模块。json,然后npm删除节点_模块中的模块。 > 若使用“npm安装”添加新模块,我不想覆盖该包。json文件。 如何做到这一点?有国旗吗。npmrc? 关于,, -M-

  • 正确地注入了值。但是,变量必须是可选的,它作为命令行参数传入(然后使用SimpleCommandLinePropertySource将其添加到Spring上下文中),并且这个参数并不总是存在。 为了提供默认值,我尝试了以下两种方法: 但是在每种情况下,冒号后面的默认参数都被注入,即使存在实际值--这似乎覆盖了Spring应该注入的内容。

  • 我想在groovy脚本中定义一个类,我可以通过SoapUI中的其他groovy脚本重用该类。 我一直试图在TestSuite属性中定义我的类,但没有成功。我希望避免在JAR中定义类,因为我们在团队中工作,每个人都必须在他们的SoapUI中导入JAR才能运行我的测试。我使用SoapUI 3.6.1 以下是我的TestSuite的制作方式: 为了简化me测试,我在“Test1”中定义了一个类,我想在“

  • 我正在我的工作空间中试验ESLint,我对缩进规则有点困惑。 以下是我的缩进设置规则: 文档中只说明了只有两个选项:空格数的正数和“tab”。 我的问题是如何定义4的标签大小,而不仅仅是“标签”?可以使用缩进规则吗? 我正在使用 vs 代码。

  • 那么不能将父版本定义为maven属性吗?