Модуль загрузки CommonJS, который не выполняет асинхронные вызовы - PullRequest
0 голосов
/ 07 января 2012

Я работаю над мобильным веб-сайтом (это не одностраничное приложение), который занимает очень мало места в JS (меньше 10 КБ и сжато).Здесь нет библиотек или внешних зависимостей, весь код написан на собственном языке.Он логически разделен на несколько файлов, которые объединяются перед развертыванием, чтобы уменьшить количество HTTP-запросов.В файлах нет явного пространства имен.То есть они выглядят примерно так:

// crossbrowser.js
function getScrollOffset() {
    // implementation
}

function ...

Это не идеально, нет явного разрешения зависимостей, и область действия может быть легко загрязнена внутри функций.Для проверки этого не выполняется обработка (lint или компилятор).В качестве первого шага я подумал, что реализация явной системы модулей может защитить от этого и сделать код лучше.

Чтение в формат модуля CommonJS и загрузчиков, таких как RequireJS, Lab.js и других, насколько я понялпри использовании модулей на стороне браузера все они ожидают загрузки их через XHR.Я не хочу этого, я хочу сохранить единый формат сценария, который содержит все модули.Мой файл выглядел бы примерно так:

var define = function () { /* ... */ };
var require = function () { /* ... */ };
define("crossbrowser", function (require, exports, module) {
    exports.getScrollOffset = function() {
        //
    };

    // etc.
});

define("foo", function (require, exports, module) {
    var crossbrowser = require('crossbrowser');
    exports.getNewOffset = function () {
        var offset = crossbrowser.getScrollOffset();
        // do something
        return offset;
    }
});

window.addEventListener('DOMContentLoaded', function () {
    // really dumb example, but I hope it gets the point across
    var crossbrowser = require('crossbrowser'),
        foo = require('foo');
    crossbrowser.scrollTo(foo.getNewOffset());
});

Вопрос в том, работает ли какой-либо из загрузчиков таким образом, или мне нужно написать собственную реализацию define и require?

Ответы [ 3 ]

2 голосов
/ 07 января 2012

Одним из преимуществ таких загрузчиков, как requirejs, является то, что вы можете использовать оптимизаторы для объединения всех ваших модулей в один минимизированный скрипт во время процесса сборки, см. RequireJS Optimizer

Это позволит вам развиваться в модульной структуре, но развернуть оптимизированную версию

1 голос
/ 04 августа 2013

Взгляните на webmake .

Webmake позволяет использовать модули CommonJS в браузере.Все файлы js объединены в один файл js.Загрузчик очень легкий.Webmake также работает с CoffeeScript.

0 голосов
/ 20 августа 2014

Если вам не нужна асинхронная загрузка, вам не нужен загрузчик AMD.Например, если вы используете r.js для объединения модулей и вам нужно загрузить в рабочий код всю библиотеку RequireJS.Почему бы просто не пойти с компилятором?Просто посмотрите на слайды CommonJS Compiler http://www.slideshare.net/dsheiko/modular-javascript-with-commonjs-compiler и вот источники / документы http://dsheiko.github.io/cjsc/

...