使用 SystemJS/jspm 在生产中加载异步、es5 模块

Posted

技术标签:

【中文标题】使用 SystemJS/jspm 在生产中加载异步、es5 模块【英文标题】:Using SystemJS/jspm to load async, es5 modules in production 【发布时间】:2016-07-01 08:18:49 【问题描述】:

我希望能够使用 System.import() 异步加载依赖项,但不必在生产运行时将 ES6 转换为 ES5。我希望将这些模块转译成单独的 ES5 模块,这些模块仅在需要时才被获取。我不希望它们成为主捆绑包的一部分。

开发工作流程

这些模块在我的生产构建期间有效加载,这实际上令人担忧,因为我不想包含任何允许编译的依赖项。

我有一个工作流,我使用jspm bundlejspm unbundle 在开发和生产配置之间切换。在我的开发环境中,我包含以下脚本:

<script src="jspm_packages/system.js"></script>
<script src="config.js"></script>

<script>
    System.import('src/main');
</script>

生产工作流程

在生产中,我使用jspm bundle --injectbundles 选项注入System.config。这实际上只加载了必要的文件:

system.js
config.js
main.bundle.js

当我在生产期间尝试使用System.import() 异步加载模块时,它加载正常,这意味着在生产期间在浏览器中进行了转译。


问题

    我可以轻松地将我的每个模块构建到 AMD 中,但我怎么还能 使用 System.import() 异步和单独获取它们?

    我还想确保包含尽可能少的浏览器开销 可能,这意味着不包括任何执行的脚本 转译。有没有办法包含system.js 有转译能力吗?

【问题讨论】:

【参考方案1】:

答案 1

System.import() 用于加载模块。模块是必不可少的 .js 文件,用于导出函数、对象或类等内容。

如果您将代码组织成单独的文件,那么您可以使用 .. 将它们加载到另一个文件的头部。

import * as YM from 'YourModuleFile';

这将使 YM 在整个文件中都可以访问。

或者,如果您希望在按钮上加载 YM,而不是点击 ..

element.onclick = function() 
    System.import('YourModuleFile').then(function(YM) 
        // YM accessible here
    )

所以重要的是在文件/模块中组织好你的代码。

然后您可以使用 npm 任务运行器(例如 gulp)来压缩文件等。

当然,您需要在 systemjs.config.js 文件中输入一些映射,例如 ..

'YourModuleFile': '/path/to/your/module/file.js'

以便 SystemJS 可以找到它。

答案 2

JSPM 有 tranpile 能力,我不确定 SystemJS 有。

确保 JSPM(或您选择的工具)转译您的文件。然后将 SystemJS 指向转换后的文件。

【讨论】:

以上是关于使用 SystemJS/jspm 在生产中加载异步、es5 模块的主要内容,如果未能解决你的问题,请参考以下文章

Ajax异步加载

vue构建优化

vue构建优化

python 关于celery的异步任务队列的基本使用(celery+redis)采用配置文件设置

MySQL 5.7的复制架构,在有异步复制半同步增强半同步MGR等的生产中,该如何选择?

使用 Autolayout 在 UITableView 中异步加载图像