我的项目是单页店面.该项目有多个模块,每个模块包含一组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文件一起存在于root中
>主要的应用程序文件大部分位于modules文件夹中
>每个模块文件夹包含其控制器,视图和模型js文件,以及template.html文件
编辑
gruntFile以前工作过,使用不同的mainConfigFile(main.js)设置:
require.config({ paths: {...} shim: {...} }) // application startup require(['app','eventbus']) { // code }
解决方法
看着
> hasRequire()
:确定AST节点是配置呼叫候选者
> findConfig()
:调用上面决定如何提取配置
我创建了一个补丁,让它意识到识别
requirejs.config(_VariableToExport = { ... });
这是有限的,并且Javascript解析器方法使得r.js能够提取由函数(例如在代码中)创建的配置等非常复杂.该补丁尚未提交给项目.我正在为官僚主义而苦苦挣扎.
我认为到目前为止唯一可行的解决方法是
>不要使用mainConfigFile
>将配置导出为NodeJS模块
>在Node(Grunt)中需要main.js / config.js
>将对象作为值传递给config属性或方法
这种方法在我正在研究的另一个较旧的项目中得到了证明.
与r.js 2.1.11相关.