grunt requirejs忽略来自我的mainConfigFile的路径

项目介绍

我的项目是单页面店面。 该项目有多个模块,每个模块包含一组controller.js,view.js和model.js文件,以及一个template.html文件。 并使用requirejs来管理依赖关系。

问题陈述

我想使用mainConfigFile为grunt-requirejs中的引用模块提供路径。 部分mainConfigFile的require.config存储在单独的文件(base.dependency.config)中,并且require.config.paths在运行时通过下划线拼凑在一起。

base.dependency.config

config = {
    baseDependencyConfig: {
        paths: { ... }
        shim: { ... }
    }
}

main.js

var dependencies = config.baseDependencyConfig;
var basePaths = config.baseDependencyConfig.paths;
var extensionPaths = {
    // extra sets of paths
};

// combine base paths and extension paths at runtime using underscore
var dependencyPaths = _.extend(basePaths, extensionPaths);

dependencies.paths = dependencyPaths;
require.config(dependencies);

// application startup
require(['app', 'eventbus']) {
    // code
}

错误

然而,grunt requirejs忽略了mainConfigFile,grunt requirejs试图在根下找到'app.js',实际上,'app'在require.config路径下被定义为

'app': 'modules/base/app/base.app.controller'

我的gruntFile:

module.exports = function (grunt) {
    grunt.initConfig({
        // ... other plugin config
        requirejs: {
            options: {
                baseUrl: 'public',
                // the paths for the named modules such as 'app' are defined 
                // in main.js under require.config paths
                name: 'main',
                include: [
                    'app',
                    'cart',
                    'category'
        ],
        out: 'public/build/app-optimized.js',
        mainConfigFile: 'public/main.js',
        findNestedDependencies: true,
        optimizeCss: 'none',
        cssImportIgnore: 'style/style.css, style/mocha.css',
            }
        }
    })
}

我的文件结构

public
    |--modules/
    |       |--base/
    |       |       |--cart
    |       |       |--category
    |       |               |--category.controller.js
    |       |               |--category.view.js
    |       |               |--category.model.js
    |       |               └-category.template.html
    |       |
    |       └--extension/
    |
    |--style/
    |--image/
    |--main.js <-- main config file
    |--other .js files
  • mainConfigFile,main.js以及其他一些应用程序启动js文件在根中
  • 主要批量的应用程序文件位于模块文件夹内
  • 每个模块文件夹都包含其控制器,视图和模型js文件以及一个template.html文件
  • 编辑

    gruntFile之前使用过不同的mainConfigFile(main.js)设置:

    require.config({
        paths: {...}
        shim: {...}
    })
    
    // application startup
    require(['app', 'eventbus']) {
        // code
    }
    

    r.js使用Esprima作为Javascript解析器从指定的mainConfigFile提取配置对象。 它只在代码中寻找特定的签名。

    看着

  • hasRequire() :确定AST节点是配置调用候选者
  • findConfig() :调用上述决定如何提取配置
  • 我创建了一个补丁程序,使其意识到识别

    requirejs.config(_VariableToExport = { ... });
    

    这是有限的,并且JavaScript解析器方法使得r.js能够提取由函数创建的配置(比如在你的代码中)是非常复杂的。 该补丁尚未提交到项目中。 我还在为官僚作风而苦苦挣扎。

    我认为目前唯一可行的解​​决方法是

  • 不要使用mainConfigFile
  • 将配置导出为NodeJS模块
  • 需要Node(Grunt)中的main.js / config.js
  • 将对象作为值传递给config属性或方法
  • 看看我对这个问题的评论。

    这种方法在另一个方面得到验证,这是我正在研究的一个较老的项目。

    关于r.js 2.1.11。

    链接地址: http://www.djcxy.com/p/16717.html

    上一篇: grunt requirejs ignores paths from my mainConfigFile

    下一篇: Mysterious Crash (NSAttributedString, iOS 7)