javascript - 有没有办法让 JS 引擎加载一个 .js 文件而不显式地从它导入一些东西?

标签 javascript angular typescript

也许我正在尝试做一些愚蠢的事情,但我有一个 Web 应用程序 (Angular2+),并且我正在尝试以可扩展/模块化的方式构建它。特别是,由于缺少更好的术语,我有各种各样的模块,我希望能够包含或不包含这些模块,具体取决于所需的部署类型。这些模块包括通过扩展基类实现的各种功能。

为了简化事情,假设有一个 GenericModuleDefinition 类,并且有两个模块 - ModuleOne.jsModuleTwo.js。第一个定义一个 ModuleOneDefinitionClass 并实例化一个导出的实例 ModuleOneDefinition,然后将其注册到 ModuleRegistry。第二个模块做类似的事情。

(要清楚 - 当 ModuleXXX.js 文件运行时(例如,由于一些其他 .js 文件导入其导出之一)。如果它没有运行,那么显然没有任何注册 - 这就是我遇到的问题,如下所述。)

ModuleRegistry 有一些方法可以遍历所有模块并调用它们各自的方法。在此示例中,可能有一个名为 ModuleRegistry.initAllModules() 的方法,该方法随后会在每个已注册的模块上调用 initModule() 方法。

在启动时,我的应用程序(例如,在 index.js 中)调用 ModuleRegistry.initAllModules()。显然,因为 index.js 导入导出的 ModuleRegistry 符号,这将导致 ModuleRegistry.js 代码被拉入,但由于两者都没有导出模块 .js 文件被显式引用,这些文件不会被拉入,因此 ModuleOneDefinitionModuleTwoDefinition 对象将不会被实例化并注册到 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/

相关文章:

javascript - 如何强制重定向到 Stripe Checkout 中 success_url 之外的另一个页面?

angular - 如何在 Angular 中引用和使用另一个模块中的组件?

node.js - hapi.js 版本 18.x 类型

android - ionic 3 native : File : {code: 5, 消息: "ENCODING_ERR"}

javascript - 脚本的可见性包含在 IFRAME 中

javascript - 如何使用鼠标锁API?

html - Angular2观察父级的css属性

typescript - 从 Redux Toolkit 的 createSlice 获取 Action 类型

javascript - 向下滚动时标题抖动

angular - 使用 activatedRoute 在 Angular 中访问编码的查询参数