【问题标题】:grunt requirejs ignores paths from my mainConfigFilegrunt requirejs 忽略来自我的 mainConfigFile 的路径
【发布时间】:2013-10-16 22:56:05
【问题描述】:

项目介绍

我的项目是一个单页店面。该项目有多个模块,每个模块包含一组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: { ... }
    }
}

ma​​in.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 试图在 root 下查找 '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
}

【问题讨论】:

  • 如果你在 baseURL 中添加一个正斜杠,比如baseUrl: '/public',会发生什么?还有requirejs在哪里?
  • requirejs 位于public/scripts/lib 文件夹内。而/public 不起作用,因为说实话,public 不是我执行 grunt 的根文件夹。公共是应用程序的唯一根文件夹。该项目还有其他组件,例如stylesrc(对于 css less),单元测试,节点模块等生活在同一公共级别。
  • 有没有可能你回溯的距离不够远,比如../../public?
  • 您好 Dropzilla,感谢您回答我的问题。我不相信找到 public 或 requirejs 是问题。当 require.config.paths 都直接在 main.js 中定义时,具有相同 gruntFile 和文件结构的确切设置起作用。请参阅上面帖子的编辑部分。
  • @user2480414,到目前为止你运行了吗?我有一个类似的项目布局(虽然 RequireJS 配置实现有点简单)并且面临同样的错误:r.js/RequireJs 不尊重我的路径配置,试图从baseUrl 加载“jquery.js”而不是配置的相对路径“../libs/jquery-N.NN.js”(带版本后缀)。

标签: javascript requirejs gruntjs grunt-contrib-requirejs


【解决方案1】:

r.js 使用Esprima as Javascript parser 从指定的mainConfigFile 中提取配置对象。它只查找代码中的某些签名。

看看

我创建了一个补丁让它意识到识别

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

这是有限的,并且 Javascript 解析器方法使得 r.js 能够提取由函数(如在您的代码中)创建的配置非常复杂。该补丁尚未提交给项目。我还在与官僚作风作斗争。

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

  • 不要使用mainConfigFile
  • 将配置导出为 NodeJS 模块
  • 在 Node (Grunt) 中需要 main.js/config.js
  • 将对象作为值传递给配置属性或方法

请参阅我对此问题的评论以获取scribble。

这种方法在我正在从事的另一个较老的项目中得到了证明。

与 r.js 2.1.11 相关。

【讨论】:

猜你喜欢
  • 2014-09-27
  • 2014-07-10
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 2015-03-03
  • 2017-07-16
  • 1970-01-01
相关资源
最近更新 更多