javascript – grunt requirejs忽略来自mainConfigFile的路径

前端之家收集整理的这篇文章主要介绍了javascript – 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尝试在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
}

解决方法

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

看着

> hasRequire():确定AST节点是配置呼叫候选者
> findConfig()调用上面决定如何提取配置

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

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

这是有限的,并且Javascript解析器方法使得r.js能够提取函数(例如在代码中)创建的配置等非常复杂.该补丁尚未提交给项目.我正在为官僚主义而苦苦挣扎.

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

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

请参阅我对此问题的评论scribble.

这种方法在我正在研究的另一个较旧的项目中得到了证明.

与r.js 2.1.11相关.

猜你在找的JavaScript相关文章