Javascript 由import语句创建的名称空间列表
我有一个脚本标记(Javascript 由import语句创建的名称空间列表,javascript,es6-modules,Javascript,Es6 Modules,我有一个脚本标记(type=“module”),它由PHP根据一些参数动态填充import语句。填充过程由站点的授权系统控制,它可以从脚本中删除一些imports,具体取决于当前用户的权限 页面上最终呈现的脚本标记示例: <script type="module"> import ui from 'path_to_ui_module'; import read from 'path_to_read_module'; import edit from 'path
type=“module”
),它由PHP根据一些参数动态填充import
语句。填充过程由站点的授权系统控制,它可以从脚本中删除一些import
s,具体取决于当前用户的权限
页面上最终呈现的脚本标记示例:
<script type="module">
import ui from 'path_to_ui_module';
import read from 'path_to_read_module';
import edit from 'path_to_edit_module'; // Could be omitted by the authorization
import create from 'path_to_create_module'; // Could be omitted by the authorization
import delete from 'path_to_delete_module'; // Could be omitted by the authorization
ui.init();
</script>
改革后的问题:是否有一个所有导入模块(包括导入模块已导入的子模块)的本地“列表”,我可以使用它来代替
选项。。在
循环中?或者,子模块是否有办法在加载后以某种方式“暴露”自己,以便创建加载模块的列表?您可以尝试使用动态导入:(我假设您的PHP脚本可以动态生成
。然后回调)
允诺
全部的
([import('./node_modules/theanswer/dist/theanswer.es.js'))
,导入('./node_modules/theanswer/dist/theanswer.es.js')
,导入('./node_modules/theanswer/dist/theanswer.es.js')
]
)
.then([{default:answer1},{default:answer2},{default:answer3}])=>{
//您现在知道了所有已加载的模块。是的,我可以修改PHP脚本以生成动态导入。但不知何故,我看不出已知模块导入的所有子模块如何与您的解决方案关联。我将尝试在代码中实现这一点,但我需要几个小时才能给出任何进一步的反馈(这是一个很晚的夜晚)。此代码可以取代静态导入,但它只能提供与问题中我的代码相同的功能,即它无法检测导入模块加载的子模块。不幸的是,我无法使用答案,但这可能对未来的读者非常有用。现在,我在所有导入模块的本地代码。导入模块的init
方法检查列表是否存在,并将列表作为属性分配给导入的对象。主模块的init
方法检查子模块的列表,并递归调用自身,将列表作为参数传递。此解决方案中的一个缺陷是,主模块本身不能包含列表。因此,我仍然对提供所有加载模块列表的答案感兴趣,最好不向子模块添加任何代码。
init (options) {
for (const module in options.modules) {
this[module] = options.modules[module]; // Add submodule reference to the main object
this[module].main = this; // Add main module reference to submodule
Object.assign(this.cmd, this[module].cmd); // Assign the cmd methods of the submodule to the main module's cmd object
this[module].init(); // Initialize the submodule
}
}