Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Кросс-стандартный экспорт модуля (https://javascript.ru/forum/misc/53284-kross-standartnyjj-ehksport-modulya.html)

FINoM 28.01.2015 11:31

Кросс-стандартный экспорт модуля
 
Всем привет! На волне восхождения EcmaScript 2015 и пика популярности 6to5 хотелось бы добавить в свою библиотеку кросс-стандартный экспорт.
AMD
(function (root, factory) {
    if (typeof define == 'function' && define.amd) {
        define(factory);
    } else {
        root.lib = factory();
    }
}(this, function (){
	return {}
});


CommonJS
if( typeof module != 'undefined' && module ) {
	module.exports = lib;
}


ES 2015
export default lib;

Как экспортировать модуль не прибегая к синтаксису ES 2015? Глобальное пространство имен System, исходя из того, что я нашел в интернете, не содержит функции export, только import.

Я могу прибенгуть к эвалу
try {
	Function( 'lib', 'export default lib;' )( lib );
} catch( e ) {}

Но такой подход не позволит работать сборщикам проекта.


Пока могу догадаться, как обхединить первые два подхода:
(function (root, factory) {
    if (typeof define == 'function' && define.amd) {
        define(factory);
    } else {
		if( typeof module != 'undefined' && root === module ) {
			root.exports = factory();
		} else {
			root.lib = factory();
		}
    }
}(this, function (){
	return {}
});


Как объединить все три подхода, не прибегая к хакам, ломающим транспилеры и минификаторы?

kobezzza 28.01.2015 12:04

Цитата:

Как экспортировать модуль не прибегая к синтаксису ES 2015?
// Декларируем явное использование ES5
'use strict';


Для получения ссылки на глобальный объект можно использовать (т.к. в ES6 нет глобальной ссылки this):

new Function('return this')()


Такая функция по умолчанию скомпилится в ES3 и вернёт ссылку на global / window.

***

https://github.com/umdjs/umd

FINoM 28.01.2015 12:10

Цитата:

Сообщение от kobezzza
Для получения ссылки на глобальный объект можно использовать (т.к. в ES6 нет глобальной ссылки this):

Хм, не знал. Спасибо.
Цитата:

Сообщение от kobezzza
https://github.com/umdjs/umd

Нагуглил после того, как написал пост :)

melky 28.01.2015 13:35

UMD (Universal Module Definition) patterns for JavaScript modules that work everywhere


Цитата:

Сообщение от FINoM
Как экспортировать модуль не прибегая к синтаксису ES 2015? Глобальное пространство имен System, исходя из того, что я нашел в интернете, не содержит функции export, только import.

это просто еще одна система модулей - SystemJS

kobezzza, йо. не заметил )

FINoM 28.01.2015 14:37

Цитата:

Сообщение от melky
это просто еще одна система модулей - SystemJS

Дык, а как сделать экспорт?

melky 28.01.2015 14:53

Цитата:

Сообщение от FINoM (Сообщение 353893)
Дык, а как сделать экспорт?

не разбирался особо, но ... вроде, он сам подхватит файл при сборке, а в своем модуле ты используешь amd\cjs. но я не уверен :)

nerv_ 28.01.2015 14:56

Цитата:

Сообщение от FINoM
пика популярности 6to5

вангую, что пик впереди :)

FINoM, у меня в этом репе грантом собираются
intro.js + module.js + outro.js

получается то, что тебе нужно.

FINoM 28.01.2015 15:40

Цитата:

Сообщение от nerv_
получается то, что тебе нужно.

Мне не собрать нужно. Нужно как-то сделать универсальный экспорт. Вопрос не решен только для ES2015. Пока что, кроме эвала строки, ничего не придумал.

nerv_ 28.01.2015 15:49

FINoM, CommonJS есть
export default lib;

насколько я понимаю. Т.е. если у тебя есть "обвеска" AMD & CommonJS, то импорт es6 будет работать.


Часовой пояс GMT +3, время: 02:58.