Backbone.js Require.js build未连接加载Jam的脚本

Backbone.js Require.js build未连接加载Jam的脚本,backbone.js,build,requirejs,amd,jam,Backbone.js,Build,Requirejs,Amd,Jam,在Addy Osmani(O'Reilly)关于“开发主干网.js应用程序”的其中一章之后,我无法创建一个构建概要文件 以下是用于此操作的文件系统树: /builds /closure /rhino /config /build.js build.sh /development /* Grunt-BBB files after init */ /app /styles index.css

在Addy Osmani(O'Reilly)关于“开发主干网.js应用程序”的其中一章之后,我无法创建一个构建概要文件

以下是用于此操作的文件系统树:

/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安装-g BBB

2) 下载r.js,它是Require.js项目(
git clone)的一部分https://github.com/backbone-boilerplate/grunt-bbb

3) 初始化样板文件(
bbb init

下面是我用来为Google Closure编译器配置r.js AMD加载程序的build.js文件:

({
    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文件样式中重新声明

最后,我的问题如下:

  • 我如何重写我的
    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.

除非您指示r.js包含require.js,否则r.js永远不会包含require.js。请参阅此链接:

该链接指的是命令行选项,但生成文件选项大致相同:

您需要在路径中为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",
抱歉,我对jam了解不够,无法说明jam是否会覆盖此设置


_Pez

Ok,因此“out”显然与“appDir”不兼容。我更改了我的'builde.js'文件(请参阅我的原始帖子),但出现了一个错误(也附加到了我的原始帖子中)。因此,结果是所有文件都被连接起来,包括2个版本的require.js,1个版本的backbone.layoutmanager,但位于jam目录中的其他资源仍然没有连接起来。我非常确定“requirejs”也是保留的依赖项名称,是否尝试使用“requireLib”?否,出于某种原因,它没有更改任何内容:SOK,这看起来很像我的构建文件,运行良好(尽管我显然不是通过jam启动的)。我唯一能建议的是FindEndependencies:true