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
    }
}