Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用r.js优化requirejs会导致未定义的错误_Javascript_R_Optimization_Requirejs_R.js - Fatal编程技术网

Javascript 使用r.js优化requirejs会导致未定义的错误

Javascript 使用r.js优化requirejs会导致未定义的错误,javascript,r,optimization,requirejs,r.js,Javascript,R,Optimization,Requirejs,R.js,我正在使用requirejs,我有一个可以工作的应用程序,但是在运行r.js Optimizer时,我发现在编译的脚本中不可能不返回任何未定义的错误 这些错误都是加载的,类似于: Uncaught TypeError: undefined is not a function 在优化之前,我有0个错误,一切正常,但在使用以下构建文件运行r.js时,加载文件时会出现未定义的js错误 我的构建文件中是否有错误?我在我的应用程序中使用了几个插件,但由于垫片在优化之前已经配置好并正在工作,我很困惑为什么

我正在使用requirejs,我有一个可以工作的应用程序,但是在运行r.js Optimizer时,我发现在编译的脚本中不可能不返回任何未定义的错误

这些错误都是加载的,类似于:

Uncaught TypeError: undefined is not a function
在优化之前,我有0个错误,一切正常,但在使用以下构建文件运行r.js时,加载文件时会出现未定义的js错误

我的构建文件中是否有错误?我在我的应用程序中使用了几个插件,但由于垫片在优化之前已经配置好并正在工作,我很困惑为什么会出现问题

需要注意的一点是,r.js没有包含导致问题的require.js,为了解决问题,我在调用主脚本之前手动包含require.js,这看起来是为了解决问题,但老实说,很难说问题出在哪里

谢谢你看!:)

main.js:

require.config({
    baseUrl: "*my base url*",
    shim: {
        jquery: {
            exports: 'jQuery'
        },
        parsley: {
            deps: ["jquery"]
        },
        marquee: {
            deps: ["jquery"]
        },
        'facebook' : {
            exports: 'FB'
        }
    },

    paths: {
        jquery: [
            "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min",
            "vendor/jquery"
        ],
        parsley: "vendor/parsley",
        marquee: "vendor/jquery.marquee.min",
        'facebook': '//connect.facebook.net/en_US/all'
    },

    waitSeconds: 0
});

requirejs(['jquery', 'modules/log', 'modules/util', 'modules/youtube/youtube', 'modules/ticker', 'parsley', 'modules/fb'
], function ($, log, util) { 

*app stuff* 

});
生成配置:

({
    appDir: './',
    baseUrl: './',
    dir: './dist',
    modules: [
        {
            name: 'main',
        }
    ],
    fileExclusionRegExp: /^(r|build)\.js$/,
    optimizeCss: 'none',
    optimize: "none",
    removeCombined: true,
    paths: {
        jquery: "empty:",
        facebook: "empty:"
    },
    shim: {
        jquery: {
            exports: 'jQuery'
        },
        'facebook' : {
            exports: 'FB'
        }
    }
})

配置中的两个问题将导致神秘的问题:

  • jQuery 1.9.1不需要垫片。拆下为其设置的垫片。了解的方法是查看要与RequireJS一起使用的库的源代码。设计用于RequireJS的库将调用
    define
    自身。不要认为调用将是文件中的第一件事。对于JQuery,调用即将结束。搜索它

  • 在构建配置(传递到
    r.js
    )中,使用指向运行时配置(
    main.js
    ,在本例中)。优化器需要具有与运行时配置完全相同的
    shim
    配置。当前,构建配置中的垫片列表不完整


  • 解决方案:

    多亏了路易斯,我才能够解决我未定义的问题。有一些问题:

  • 我为jQuery1.9.1提供了一个垫片,正如Louis指出的那样,这不是必需的
  • 我有一个不完整的部署文件,使用maincigfile属性复制main.js配置是一种很好的排序方法
  • 我有两个导致问题的插件,一个是AMD兼容的,另一个不是
  • 为了解决部署脚本问题,我只需要删除jquery和parsley的垫片,因为它们都是兼容的,所以不需要垫片,而是使用mainConfigFile匹配main.js配置

    这将导致在terminal/cmd中运行r.js时出错,因为jquery位于CDN中。要解决这个问题,只需在build.js中的paths属性中添加“jquery”:“empty:”。这将覆盖main.js配置,允许r.js继续

    为了解决插件错误,我只需要像您自己的模块一样使用define方法包装这两个插件,不需要返回任何内容,只需确保列出了依赖项

    最后资料来源:

    main.js

    require.config({
        baseUrl: "*my base url*",
        shim: {
            'facebook' : {
                exports: 'FB'
            }
        },
        paths: {
            jquery: [
                "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min",
                "vendor/jquery"
            ],
            parsley: "vendor/parsley",
            marquee: "vendor/jquery.marquee.min",
            'facebook': '//connect.facebook.net/en_US/all'
        },
    
        waitSeconds: 0
    });
    
    build.js

    ({
        appDir: './',
        baseUrl: './',
        dir: './dist',
        modules: [
            {
                name: 'main',
            }
        ],
        fileExclusionRegExp: /^(r|build)\.js$/,
        optimizeCss: 'none',
        removeCombined: true,
        mainConfigFile: './main.js',
        paths: {
            "jquery": "empty:"
        }
    })
    
    插件示例:

    define(['jquery'], function (jQuery) {
         *some jquery plugin code*
    });
    

    谢谢路易斯,谢谢你的帮助!您的提示帮助我找到了问题,我将接受您的答案并添加我编辑的文件供其他人查看。