Все текущие модульные погрузчики, как AMD,CommonJS,SystemJS
с использованием определений переменных для загрузки внешних объектов в текущем модуле объемДинамический ES6 модуль прицелы
как:
var something = require('something');
или:
define('module',['something'],function(something){});
В случае когда вы не знаете, что вам нужно импортировать из внешнего модуля, или просто нужно импортировать все, это становится проблемой, поскольку невозможно определить переменную во время выполнения.
Я предполагаю, что это главная причина, почему ES6 переводчики не используя
import * from 'something';
синтаксис и они не включены в это ES6 Spec.
Так, говоря динамический модуль сферы я имею в виду, что переменные модуля могут быть определены/загружены во время выполнения, что позволит расширить синтаксис ES6 к чему-то как:
import * from 'something';
import Something.* from 'something';
import /regexp/ from 'something';
На мой взгляд, это более оптимальный способ определения импорта, а затем перечислить все имена, как:
import {
ONE,
TWO,
...
} from 'something';
Теперь мой вопрос:
Почему бы не использовать
with
для этого?
Вот простой пример перевода из ES6 в ES5, которые могут решить проблему:
файл: модули/модуль-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
// ...
};
});
}
})();
файл: modules/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
даже в transpilers/погрузчиками?
Я по достоинству оценит ваши мысли об этих парнях, потому что я подумываю написать еще один переводчик ES6to5 и загрузчик модулей. :)
Почему вы хотите написать транспилер, который не соответствует спецификации? Для меня это не имеет смысла. Конечно, вы можете делать все, что хотите, и использовать свой собственный диалект JS. –