Ann*_*ing 7 javascript requirejs gruntjs grunt-contrib-requirejs
我的项目是单页店面.该项目有多个模块,每个模块包含一组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: { ... }
}
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
但是,grunt requirejs忽略了mainConfigFile,grunt requirejs尝试在root下找到'app.js',实际上,'app'在require.config路径下定义为
'app': 'modules/base/app/base.app.controller'
Run Code Online (Sandbox Code Playgroud)
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',
}
}
})
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
gruntFile以前工作过,使用不同的mainConfigFile(main.js)设置:
require.config({
paths: {...}
shim: {...}
})
// application startup
require(['app', 'eventbus']) {
// code
}
Run Code Online (Sandbox Code Playgroud)
r.js 使用Esprima 作为 Javascript 解析器从指定的mainConfigFile. 它只查找代码中的某些签名。
看着
hasRequire():确定 AST 节点是配置调用候选者findConfig():调用上面决定如何提取配置我创建了一个补丁,让它能够识别
requirejs.config(_VariableToExport = { ... });
Run Code Online (Sandbox Code Playgroud)
这是有限的,Javascript 解析器方法使得 r.js 能够提取由函数(例如在您的代码中)创建的配置变得非常复杂。该补丁尚未提交给项目。我还在与官僚作风作斗争。
我认为到目前为止唯一可行的解决方法是
mainConfigFilemain.js/ config.js(Grunt)请参阅我对此问题的评论以进行涂鸦。
这种方法在我正在从事的另一个稍旧的项目中得到了证明。
与 r.js 2.1.11 相关。