node.js - System.import 异步模块加载与脚本标签同步加载冲突

标签 node.js jspm systemjs electron

我开始使用带有原子/Electron 的 JSPM 来移植我使用 Marionette 构建的网站。

我的所有应用程序都是围绕 Marionette 模块编写的,因此我想在启动应用程序之前加载所有 JavasSript 文件。

<script src="jspm_packages/system.js"></script>
<script src="config.js"></script>
<script>
    loadApp = System.import('./scripts/app_definition').then(function(m){
        window.App = m['App'];
    });
</script>

<!-- inject:js -->
    ##LOTS INJECTED SCRIPTS THAT NEEDS window.App to be defined##
    <script src="compiled/modules/video/video_app.js"></script>
<!-- endinject -->

<script type="text/javascript">
    loadApp.then(function(){
        App.start();
    })
</script>

我遇到了 System.import() 的异步性质问题。 System.import 完成加载应用程序代码后,您将如何加载脚本?

对于生产,我对此没有问题,因为我会将所有文件连接到一个 js 模块中,并使用 System.import 加载该模块,但这对调试来说是一场噩梦,我更愿意拥有这些文件单独加载。

有什么想法吗?谢谢!

最佳答案

使用 ES6 模块时,全局变量是一个大禁忌。

您可以在应用程序定义后加载脚本:

loadApp = System.import('./scripts/app_definition').then(function(m){
    window.App = m['App'];

    var scriptEl = document.createElement('script');
    scriptEl.src = "compiled/modules/video/video_app.js";
    document.head.appendChild(scriptEl);
});

但我不确定 JSPM 在这里有什么用处。因此,真正的解决方案是将所有模块转换为 ES6 导入语法,并避免使用全局变量。

关于node.js - System.import 异步模块加载与脚本标签同步加载冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30265797/

相关文章:

javascript - ES6 + SystemJs - 为什么我必须使用 .js 扩展名来导入 es6 模块?

node.js - 如何在 Nodejs 中处理 KML/GeoJSON?

node.js - 水平扩展的 WebSocket 服务器上的负载平衡套接字?

javascript - 如何重写这个 promise 链以避免需要多个函数?

node.js - 将 jspm 安装到 ^0.16.34 没有提供注册表属性

angular - 轻松部署 Angular2 应用程序,我需要学习 SystemJS 和 Gulp 吗?

node.js - Socket.io + NodeJS IONIC CORS 问题

javascript - JSPM bundle 与 requireJs 的混淆

d3.js - 带有 ES6 模块的 d3 v4.0 自定义构建

angular - 将 Angular2 HTML 和 TypeScript 构建到单个文件