Здравствуйте!
Достаточно безумная задача.
Есть js-файлик с набором функций, написанный под браузер, нужно его под node.js портировать.
Без RequireJS, Grunt, сторонних библиотек и сборщиков.
Кроме того, внутри "модуля" нужно получить ссылку на глобальный объект (window в браузере, global в ноде).
Сразу код:
var MySuperModule = (function (exports, global, undefined) {
"use strict";
var mo = {},
nativeObjectProto = global.Object.prototype,
nativeToString = nativeObjectProto.toString;
/**
* @name MySuperModule.valueToString
*/
mo.valueToString = function valueToString(value) {
return nativeToString.call(value);
};
if (global !== exports) {
exports.mo = mo;
}
return mo;
})(this, (function () {return this;})());
Глобальный объект получаю с помощью
(function () {return this;})() // функция по умолчанию вызывается в контексте global
this в node указывает на exports, в браузере на window.
Вопросы:
1. Можно это сделать покрасивее (в рамках условий задачи)?
2. Как полностью заменить exports на содержимое модуля? То есть сделать:
module.exports = mo;
Для этого нужно получить переменную module.
Нашёл два варианта:
eval.apply("module")
но за eval() и линчевать могут.
var module; // вверху
Второй вариант вполне работает и лишняя переменная ничему не мешает, даже если в браузере до этого был уже определён модуль.
Но всё равно как-то некрасиво лишнее определение делать.
Можно по-другому?