0

我正在将使用System.import从 traceur 到 Babel 的应用程序移植。我的简化 HTML 如下所示:

<script src="../node_modules/babel-core/browser.js"></script>
<script src="../node_modules/es6-module-loader/dist/es6-module-loader-dev.js"></script>
<script> 
    System.transpiler = 'babel';
    System.import('./css');
</script>

这给了我

Uncaught (in promise) File not found: http://connect:8000/sam/css
    Error loading http://connect:8000/sam/css

相反,如果我使用扩展名指定 , 它可以工作./css.js。但是,然后在 内部和整个系统中.js导入表单css.js

import 'foo';

失败。

似乎 es6-module-loader 想要.js扩展。我注意到es6-module-loader中的一些提交涉及演示页面,它.js为导入的名称添加了扩展名。在这个页面上,我也看到

默认情况下也不再添加 .js 扩展名。这些更改是过渡到新规范工作的一部分。有关详细信息,请参阅 whatwg/loader#52 的讨论。如果需要,可以使用自定义挂钩轻松添加 .js 扩展名。

但我不知道指的是哪种钩子,或者如何编写它。

我知道在浏览器中动态加载和转译可能并不理想,也不是一种强大的生产方法。但是,这个特定的应用程序会动态加载单个 ES6 文件,我暂时需要坚持这样做。

我的问题是:es6-module-loader 是否需要.js扩展名,或者有没有办法告诉它.js默认查找文件?

4

1 回答 1

0

根据https://github.com/ModuleLoader/es6-module-loader/blob/master/docs/loader-extensions.md上的文档,我最终覆盖了locate钩子:

var systemLocate = System.locate;                                                                  
System.locate = function(load) {                                                                   
  var System = this; // its good to ensure exact instance-binding                                  
  return Promise.resolve(systemLocate.call(this, load)).then(function(address) {                   
    return address + '.js';                                                                        
  });                                                                                              
}                                                                                                  
于 2015-08-02T18:42:46.170 回答