Показать сообщение отдельно
  #1 (permalink)  
Старый 12.11.2014, 19:20
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

Заставить js-файл работать в браузере и в node.js
Здравствуйте!

Достаточно безумная задача.
Есть 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; // вверху


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

Можно по-другому?
Ответить с цитированием