r.js没有正确编译shimmed脚本

时间:2013-05-23 21:32:06

标签: javascript requirejs gruntjs r.js

我能够通过Grunt的requirejs任务成功编译我的JS模块,但我正在使用任何填充程序脚本进行未定义。这是我的配置

requirejs.config({
    "baseUrl": "../../../components/",
    "paths": {
        "less": "less.js/dist/less-1.3.3",
        "datepicker": "jquery-ui/ui/jquery.ui.datepicker",
        "jquery": "jquery/jquery",
        "jqueryui": "jquery-ui/ui/jquery-ui",
        "spectrum": "spectrum/spectrum",
        "class": "class/class",
        "underscore": "underscore-amd/underscore",
        "d3": "d3/d3",
        "nv": "nvd3/nv.d3",
        "dataTables": "datatables/dataTables"

    },
    shim: {
        less: {
            exports: "less"
        },
        jqueryui: {
            exports: "jqueryui"
        },
        spectrum: {
            exports: "spectrum"
        },
        class:{
            deps: [ 'jquery'],
            exports: "class"
        }
    }   
})

这是我的Gruntfile中的requirejs配置:

requirejs: {
    dist: {
        options: {
            mainConfigFile: 'src/scripts/main.js',
            out: '<%= yeoman.dist %>/scripts/main.js',
            paths:{
                "main" : "../final/src/scripts/main"
            },
            include:['main'],
            preserveLicenseComments: false,
            useStrict: true,
            wrap: true
        }
    }
}

现在当我运行grunt requirejs:dist它编译得很好,并且包含我的shimmed文件。但每当我尝试运行已编译的JS时,对我的任何shimmed脚本的访问都是未定义的。

1 个答案:

答案 0 :(得分:0)

不确定“访问任何我的shimmed脚本是不确定的”是什么意思。您需要确保按正确的顺序包含填充脚本。您也可以尝试为该脚本定义伪模块。在您构建JS配置时添加:

onBuildRead: function (moduleName, path, contents) {
    if (moduleNam === 'spectrum'){
        contents += '; define(' + moduleName + ', function(){ return window.spectrum; });';
    }
    return contents;
}

您需要了解出口的作用。加载脚本后,它将在全局命名空间中查找该变量。我不认为有'jqueryui'命名空间。所以它总是未定义的,因为它必须在jQuery之后加载它只是扩展jQuery,所以模块不能返回任何有用的东西。

我希望有所帮助。