【发布时间】: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: { ... }
}
}
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 试图在 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