也许我正在尝试做一些愚蠢的事情,但我有一个 Web 应用程序 (Angular2+),并且我正在尝试以可扩展/模块化的方式构建它。特别是,由于缺少更好的术语,我有各种各样的模块,我希望能够包含或不包含这些模块,具体取决于所需的部署类型。这些模块包括通过扩展基类实现的各种功能。
为了简化事情,假设有一个 GenericModuleDefinition
类,并且有两个模块 - ModuleOne.js
和 ModuleTwo.js
。第一个定义一个 ModuleOneDefinitionClass
并实例化一个导出的实例 ModuleOneDefinition
,然后将其注册到 ModuleRegistry
。第二个模块做类似的事情。
(要清楚 - 当 ModuleXXX.js
文件运行时(例如,由于一些其他 .js 文件导入其导出之一)。如果它没有运行,那么显然没有任何注册 - 这就是我遇到的问题,如下所述。)
ModuleRegistry
有一些方法可以遍历所有模块并调用它们各自的方法。在此示例中,可能有一个名为 ModuleRegistry.initAllModules()
的方法,该方法随后会在每个已注册的模块上调用 initModule()
方法。
在启动时,我的应用程序(例如,在 index.js
中)调用 ModuleRegistry.initAllModules()
。显然,因为 index.js 导入导出的 ModuleRegistry
符号,这将导致 ModuleRegistry.js
代码被拉入,但由于两者都没有导出模块 .js 文件被显式引用,这些文件不会被拉入,因此 ModuleOneDefinition
和 ModuleTwoDefinition
对象将不会被实例化并注册到 ModuleRegistry
- 因此对 initAllModules()
的调用将毫无意义。
显然,我可以在我的 index.js
中对这些 ModuleDefinition
对象中的每一个添加无意义的引用,这会强制将它们拉入,以便它们在我调用 initAllModules()
时注册。但这需要更改 index.js
文件,具体取决于我是否要使用 ModuleTwo 来部署它。我希望仅仅存在 ModuleTwo.js
就足以导致文件被拉入,并且生成的 ModuleTwoDefinition
可以在 ModuleRegistry 中注册
。
有没有标准的方法来处理这种情况?我是否必须编辑一些全局文件(index.js
或它引用的其他文件),以便它包含所有包含的模块的信息,以便它可以去加载它们?或者是否有一种聪明的方法让 JavaScript 执行目录中的所有 .js 文件,以便仅复制文件就足以让它们在启动时加载?
最佳答案
导致 xxJavaScriptxx 的聪明方法 Node.js执行目录中的所有 .js 文件:
var fs = require('fs') // node filesystem
var path = require('path') // node path
function hasJsExtension(item) {
return item != 'index.js' && path.extname(item) === '.js'
}
function pathHere(item) {
return path.join('.', item)
}
fs.readdir('./', function(err, list) {
if (err) return err
list.filter(hasJsExtension).map(pathHere).forEach(require) // require them all
})
Angular 有很大的不同,如果是 ng serve 检查你的应用程序是否需要一个模块,如果需要,则在任何需要的时候提供相应的 js 文件,而不是在第一次加载时。
事实上,你的情况让我想起了带有头文件 声明 和带有实现的 cpp 文件的 C++,也许你只需要在 initAllModules 之前有一个 defineAllModules 函数。
另一种方法可以考虑找出如何从 ng-serve 中排除这些模块,并在其他模块之前将它们作为脚本包含在您的 HTML 中,它们将被定义(如果存在并且被提供),并由 angular 调用如果有必要,唯一需要注意的是,如果未获取一个脚本标记,控制台会出现错误,但您的应用无论如何都会正常工作,如果它应该这样做的话。
但无论如何,它将在 ng-serve 和 HTML 中的某处声明/定义这些模块。
在您自己的特殊情况下,并且不愿意低估 ng-serve,但是您的应用程序的总 js 是否太重而无法立即提供服务? (缩小和所有......),因为 good-to-go 解决方案可能是从你的 dev js 文件夹中随意构建和重建你的生产 all.js 的众多工具之一,或者就像你说的,在你的文件夹中拖放。
同样,此类工具是服务器端的,但即使您只能推送/FTP 您的 javascript,您也可以在您喜欢的开发环境中使用它并推送您的新版本。要查看此类工具的列表,请搜索“YourDevEnvironment bundle javascript”。
关于javascript - 有没有办法让 JS 引擎加载一个 .js 文件而不显式地从它导入一些东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50485944/