Require.js создает не конкатенационные скрипты, загруженные с помощью Jam

Следуя одной из глав "Разработка Backbone.js Apllication" Эдди Османи (O'Reilly) о Grunt-BBB (Backbone Boilerplate Buddy), я просто не смог создать профиль сборки.

Вот дерево файловой системы, используемое для этого:

/builds
    /closure
    /rhino
    /config
        /build.js
    build.sh
/development
    /* Grunt-BBB files after init */
    /app
        /styles
            index.css
        app.js
        config.js
        main.js
        router.js
    /test
        /* Not important files used for testing */
    /vendor
        /h5bp
            /css
                main.css
                normalize.css
        /jam
            /backbone
                backbone.js
                package.json
            /bakbone.layoutmanager
                bakbone.layoutmanager.js
                package.json
            /jquery
                jquery.js
                package.json
            /lodash
                lodash.js
                lodash.min.js
                lodash.underscore.min.js
                package.json
            require.config.js
            require.js
        /js
            /libs
                almond.js
                require.js
/distribution
    /* Empty dist directory where the optimized / minified / concatenated files should go */

Вот шаги, которые я следовал в /development каталог:

1) Установить Grunt-BBB (npm install -g bbb)

2) Загрузите r.js, часть проекта Require.js (git clone https://github.com/backbone-boilerplate/grunt-bbb)

3) Инициализировать файлы шаблона (bbb init)

Вот файл build.js, который я использовал для настройки загрузчика AMD r.js для компилятора Google Closure:

({
    appDir: '../../development',
    baseUrl: 'app',
    dir: '../../distribution',
    optimize: 'closure', // 'uglify2'
    paths: {
        backbone: '../vendor/jam/backbone/backbone',
        'backbone.layoutmanager': '../vendor/jam/backbone.layoutmanager/backbone.layoutmanager',
        jquery: '../vendor/jam/jquery/jquery',
        lodash: '../vendor/jam/lodash/backbone.min'
    },
    modules: [
        {
            name: 'main'
        }
    ],
    onBuildRead: function(moduleNames, path, contents) {
        return contents;
        //return contents.replace(/console\.log\(([^\)]+)\);/g, '')
        //              .replace(/debugger;/, '');
    }
})

и это файл build.sh, который я использую:

#!/usr/bin/env bash

# r.js directory
RJSDIR="r.js"
RJS="$RJSDIR/dist/r.js"

# Rhino directory
RHINODIR="rhino"
RHINO="$RHINODIR/js.jar"

# Google Closure Compiler directory
CLOSUREDIR="closure"
CLOSURE="$CLOSUREDIR/compiler.jar"

# Build config directory
CONFIGDIR="config"
CONFIG="$CONFIGDIR/build.js"

# Launch compillation
java -Xms256m -Xmx256m -classpath "$RHINO":"$CLOSURE" org.mozilla.javascript.tools.shell.Main "$RJS" -o "$CONFIG" $@

Моя цель - оптимизировать, минимизировать, объединить все файлы JavaScrit, включая библиотеки и шаблоны (которых у меня еще нет, я использую только шаблоны), а также файлы CSS.

Результат, который я получаю, бегая ./build.sh заключается в том, что все файлы правильно минимизированы (кроме встраивания правил CSS, но это не имеет значения) и объединены, но ресурсы, которые загружаются и управляются Jam (диспетчером пакетов, который объединяет NPM и Require.js), не объединяются.

Причина в том, что, поскольку они уже загружены / управляются Jam, они не объявляются повторно в файлах JavaScript в стиле AMD.

В заключение мои вопросы следующие:

  • Как я могу переписать мой build.js файл конфигурации, чтобы ресурсы, загруженные Jam, также были включены и объединены в файле release / dist?

  • Как сделать так, чтобы объединенные ресурсы не копировались в каталог realse / dist? Можно ли настроить это в build.js файл или это должно идти в моем build.sh файл?

Редактировать: новый файл build.js:

({
    appDir: '../../development',
    baseUrl: 'app',
    dir: '../../distribution',
    optimize: 'closure', // 'uglify2'
    paths: {
        requirejs : '../vendor/jam/require',
        backbone: '../vendor/jam/backbone/backbone',
        'backbone.layoutmanager': '../vendor/jam/backbone.layoutmanager/backbone.layoutmanager',
        jquery: '../vendor/jam/jquery/jquery',
        lodash: '../vendor/jam/lodash/backbone.min'
    },
    name: 'main',
    include: ['requirejs'],
    onBuildRead: function(moduleNames, path, contents) {
        return contents;
        //return contents.replace(/console\.log\(([^\)]+)\);/g, '')
        //              .replace(/debugger;/, '');
    }
})

А вот и ошибка:

file:///vendor/js/libs/require.jsFailed to load resource: The requested URL was not found on this server.
file:///app/styles/index.cssFailed to load resource: The requested URL was not found on this server.

1 ответ

require.js никогда не включается в r.js, если вы не указали это сделать. Смотрите эту ссылку:

http://requirejs.org/docs/optimization.html

Ссылка относится к параметрам командной строки, но параметры файла компоновки в целом такие же:

вам нужно определить фиктивный модуль для require.js в ваших путях:

paths: {
    requireLib : '/path/to/require.js'
    backbone: '../vendor/jam/backbone/backbone',
    'backbone.layoutmanager': '../vendor/jam/backbone.layoutmanager/backbone.layoutmanager',
    jquery: '../vendor/jam/jquery/jquery',
    lodash: '../vendor/jam/lodash/backbone.min'
},

и включите это:

name "main",    
include: ["requireLib"],

Вы можете убедиться, что все исключенные зависимости разрешены, установив:

findNestedDependencies: true,

Вы можете настроить выходной путь, используя 'out' в вашем файле сборки

out: "path/to/my/builtfile-1.0.0.js",

Извините, я не знаю достаточно о джеме, чтобы сказать, будет ли джем отменять эту настройку

_Pez

Другие вопросы по тегам