0

我正在尝试使用 grunt 缩小我的 requirejs 应用程序,它输出所有缩小的文件,我的 main.js 获取所有使用的脚本等......我从定义公用文件夹的级别运行 grunt

但是当我尝试运行优化的主 js 文件时它不起作用并说没有为我的“kinvey”模块定义 Backbone.. (//da189i1jfloii.cloudfront.net/js/kinvey-backbone-1.1.6.min .js)请帮助我搜索了几个小时,但它不起作用!

目录布局:

public
 - js
  - libs (all libraries i use)
  - folders / containing modules
  - main.js
  - app.js
 - img ...

主.js:

require.config
(
    {
        paths : {
            'jquery' : 'libs/jquery-1.10.1.min',
            'backbone' : 'libs/backbone.min', // -1.1.2 amd
            'underscore' : 'libs/underscore-1.6.0.min',
            'kinvey' : 'libs/kinvey-backbone-1.1.6.min' // amd
        },
        shim : {
            'underscore' : {
                exports : '_'
            },
            'backbone' : {
                exports : 'Backbone',
                deps : ['jquery','underscore']
            },
            'kinvey' : {
                deps: ['backbone','underscore'],
                //exports: 'Kinvey',
            }
        },
        //deps : ['jquery','underscore']            
    }
);

require
(
    ['backbone', 'kinvey', 'app'],
    function(Backbone, Kinvey, Application)
    {
        'use strict';

        var init = Kinvey.init({ appKey: '...', appSecret : '..'});

        init.then(function(activeUser)
        {       
            if (!activeUser)
            {
                window.location = '/login';
            }
            else
            {
                Application.start();
            }
        }, function(error) {
            alert("Something went wrong.. Please try again.");
            window.location = '/home';
        });     
    }
);

咕噜声文件包含:

                mainConfigFile: "public/js/main.js",
                modules: [
                    {
                        name: 'main',
                     include: ['backbone',
              'kinvey',
              'app']
          }
                ],
                //name: "libs/almond", // node_modules/almond/almond.js
                //wrap: true,
                optimize : 'none',
                dir: "release",

由于某种原因,输出文件包含主干模块,然后在其下方是kinvey代码..但是由于某种原因,当kinvey代码运行时Backbone不存在,但它需要,因为它依赖于它(就像我在配置中所做的那样)。

未优化时确实可以正常工作!

请帮助我我一无所知..

4

2 回答 2

1

您的配置中有注释,在您的主干路径旁边和您的 Kinvey 路径旁边显示“amd”。AMD 风格的模块不需要垫片。(快速检查 Backbone 1.1.2 和 Kinvey 1.1.6 的代码表明它们都调用了define,因此是 AMD 风格的模块。)

不必要的垫片的存在通常不会立即引起问题。因此,当代码未优化时,您的代码可能会与不必要的垫片一起使用,但在优化时会失败。或者,举一个完全不同的例子,在 Chrome 上运行但在 IE8 上失败的代码。等等等等, ...

编辑:好的,所以您(正确地)指出 Kinvey 没有在其依赖项中列出 Backbone。这可能是因为在修改 Backbone 以支持 AMD 之前,该版本的 Kinvey 仍然需要旧版本的 Backbone。您在这里有多种选择:

  • 使用不兼容 AMD 的旧版 Backbone。你需要一个垫片。(Kinvey 仍然没有垫片。)

  • 故意将 Backbone 导出到全局空间。您可以在调用文件后修改代码,require.config如下main.js所示:

    require(['backbone'], function (Backbone) {
        window.Backbone = Backbone;
        require(['kinvey', 'app'], function(Kinvey, Application) {
            'use strict';
    
            var init = Kinvey.init({ appKey: '...', appSecret : '..'});
            // Etc. Same code as you originally had.
        });
    });
    

这在加载backbone 之前 kinvey加载,并将其导出到全局空间。然后 Kinvey 应该能够找到它。

于 2014-03-03T17:38:30.980 回答
0

同样的问题在这里

尝试加载主干 1.0.0

我对骨干 1.1.2 有同样的问题

这是一个可能有帮助的问题跟踪器

https://github.com/jrburke/requirejs/issues/987

Backbone 1.0.0似乎已经为我解决了这个问题。

于 2014-05-29T10:56:02.213 回答