有条件地加载JS模块(SystemJS)

时间:2016-03-04 23:55:22

标签: javascript systemjs jspm

我目前正在使用jspm和SystemJS来加载ES6模块。但是,我希望能够

  • 扫描某些选择器的页面(例如iddata-plugin

  • 将这些选择器映射到其模块依赖关系

  • 仅加载 那些模块

我的想法是通过可以访问System.import('src/main')的单个入口点document来处理这些导入。然后我可以找到相关的选择器,将这些选择器映射到模块,然后import这些模块。

src/main看起来像这样:

['d3', 'jquery'].forEach(function(dependency) {
    import dependency;
});

这不是一个可行的解决方案,因为它是无效的语法。在这种意义上,是否有更好的方法来实现动态模块加载?

1 个答案:

答案 0 :(得分:3)

正常import语法不能用于有条件地加载模块,正如您已经看到的那样。为了解决这个问题,我们可以使用System提供的编程API。您已经熟悉此API,因为您将其用于System.import('src/main');

要有条件地加载模块,而不是使用import关键字,您只需继续使用System.import方法。

这方面的一个例子:

的index.html

<!DOCTYPE html>
<html>
<head>
  <script src="jspm_packages/system.js"></script>
  <script src="config.js"></script>
</head>
<body>
  <div id='one'>One</div>
  <div>Two</div>

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

main.js

const map = {
  '#one': 'one',
  '#two': 'two'
};

for (let selector in map) {
  if (document.querySelector(selector)) {
    System.import(map[selector]);
  }
}

one.js

window.HAS_ONE = true;

two.js

window.HAS_TWO = true;

在此示例中,将定义window.HAS_ONE,但window.HAS_TWO将保留undefined