所有当前的模块加载器都喜欢AMD,CommonJS,SystemJS
使用变量定义将外部对象加载到当前模块范围内
喜欢:
var something = require('something');
或者:
define('module',['something'],function(something){});
如果您不知道需要从外部模块导入什么,或者只需要导入所有内容,这将成为问题,因为无法在运行时定义变量。
我想这是 ES6 翻译器不使用的主要原因
import * from 'something';
语法,它们不包含在 ES6 规范中。
因此,通过说动态模块范围,我的意思是模块变量可以在运行时定义/加载,这将允许将 ES6 语法扩展到以下内容:
import * from 'something';
import Something.* from 'something';
import /regexp/ from 'something';
在我看来,这是定义导入的更佳方式,而不是列出所有名称,例如:
import {
ONE,
TWO,
...
} from 'something';
现在我真正的问题:
为什么不使用
with
来实现这一点?
这是从 ES6 到 ES5 的简单示例翻译,可以解决问题:
文件:模块/module-1.js
var localVar = 'VALUE';
function localFun(a,b){
return a +' and '+ b;
}
export {
localVar as module1Var
localFun as module1Fun
}
至:
(function(){
// define module named 'modules/module-1'
// and return related scope object
// containing 'execute_module' function predefined
with (define_module('modules/module-1')) {
// will register actual module execution
// which will be called after all imports
// initialized
execute_module(function(){
var localVar = 'VALUE';
function localFun(a,b){
return a +' and '+ b;
}
// returns value as current module exports
return {
module1Var : localVar,
module1Fun : localFun
// ...
};
});
}
})();
文件:模块/module-1.js
import * from 'modules/module-1.js';
console.info(module1Fun(module1Var)); //prints: VALUE and VALUE
至:
(function(){
// define module named 'modules/module-2'
// after execute is called loader will do
// all imports and bind exports from modules
// to current module scope and then invoke callback
// after which imported variables will appear in with scope
// and will be visible in callback scope.
with (define_module('modules/module-2',{
'modules/module-1' : '*',
// also can filter exports by regexp
'modules/other' : /.*/
})) {
execute_module(function(){
console.info(module1Fun(module1Var)); //prints: VALUE and VALUE
});
}
})();
with
即使在转译器/加载器中,真的有必要避免吗?
我会感谢您对这些人的想法,因为我正在考虑编写另一个 ES6to5 翻译器和模块加载器。:)