javascript - Require.js 正在伤害我的大脑。关于加载脚本/模块的方式的一些基本问题

标签 javascript jquery module requirejs

让我们假设这是我的 config.js 或 main.js:

require.config({
    // paths are analogous to old-school <script> tags, in order to reference js scripts
    paths: {
        jquery: "libs/jquery-1.7.2.min",
        underscore: "libs/underscore-min",
        backbone: "libs/backbone-min",
        jquerymobile: "libs/jquery.mobile-1.1.0.min",
        jquerymobilerouter: "libs/jquery.mobile.router.min"
    },
    // configure dependencies and export value aliases for old-school js scripts
    shim: {
        jquery: ["require"],
        underscore: {
            deps: ["jquery"],
            exports: "_"
        },
        backbone: {
            deps: ["underscore", "jquery"],
            exports: "Backbone"
        },
        jquerymobilerouter: ["jquery", "backbone", "underscore"],
        jquerymobile: ["jquery", "jquerymobilerouter", "backbone", "underscore"]
    }
});
require(["jquery", "backbone", "underscore", "app/app.min", "jquerymobilerouter", "jquerymobile"], function ($, Backbone, _, App) {
    console.log($);
    console.log(Backbone);
    console.log(_);
    $("body").fadeIn(function () {
        App.init();
    });
});
  • 如果我理解正确,paths配置选项允许您引用脚本,a-la <script> HTML 中的标记。假设是这种情况,我是否还需要使用 $ 为 jQuery 等脚本添加别名?或下划线 _在我下面的实际要求声明中?考虑到如果您使用标准 <script> 引用 jQuery,我不得不这样做似乎很奇怪。标签,$可以在整个脚本中自动使用。使用 paths 不应该是一样的?
  • 我是新来的 shim config 选项,据我所知已经取代了弃用的 order!插入。 exports有什么用属性(property)居然做?它似乎没有为脚本创建别名;例如,如果我设置 exports下划线到 "whatever" ,然后尝试 console.log(whatever) ,未定义。那么有什么意义呢?
  • 如何“全局”正确使用像 jQuery 这样的脚本?也就是说,能够使用 $ 的正确方法是什么?我的 App.js 模块中的别名,或“app”文件夹中的任何其他模块?我是否必须在每个单独的模块和别名中都需要 jQuery $每一次?或者我在这里做的方式是正确的吗?

  • 我也非常感谢对这个特定脚本的任何其他批评;在我看来,Require.js 的文档还有很多不足之处;我真的很想了解更多的事情似乎被掩盖了,让我摸不着头脑。

    最佳答案

  • 路径告诉 require.js 当您需要该依赖项时去哪里查看。

    例如,我有这样配置的东西:
    "paths": { 
        "jquery": "require_jquery"
    },
    "shim": {
        "jquery-cookie"  : ["jquery"],
        "bootstrap-tab"  : ["jquery"],
        "bootstrap-modal": ["jquery"],
        "bootstrap-alert": ["jquery"]
    },
    

    这意味着每次在模块中我都这样做
    define( ['jquery']
    

    requirejs 加载文件 require_jquery从主路径而不是尝试加载 jquery.js。在您的情况下,它将加载 jQuery 源文件,然后全局可用。我个人不喜欢这种方法,因此在 require_jquery.js 文件中我这样做:
    define( ["jquery_1.7.2"], function() {
        // Raw jQuery does not return anything, so return it explicitly here.
        return jQuery.noConflict( true );
    } );
    

    这意味着 jQuery 将仅在我的模块中定义。 (这是因为我编写了 Wordpress 插件,所以我可以在不涉及外部版本的情况下包含我自己的 jQuery 版本)
  • 导出(从文档中读取的应该是您正在使用的模块的名称,以便在加载正确时可以检测到它。解释了 Here。因此,如果您想为下划线设置导出,它应该是 _
  • 正如我所解释的,jQuery 应该是全局的,如果你简单地导入它,文件就会被执行并且 jQuery 是全局的

  • 编辑 - 回答评论。
  • 是的,我的意思是,您必须为 jQuery 导出 $ 或 jQuery,为主干导出 _。从我从文档中获得的信息来看,这仅在某些边缘情况下才需要,而对于在全局命名空间中将自身声明为 jQuery 的库则不需要。

    我认为 requirejs 在必须从 CDN 加载 jQuery 后退时需要它们。我认为 requirejs 首先尝试从 CDN 加载 jQuery,然后通过检查“exported”变量是否存在来验证它是否正确加载,如果不存在,则从本地文件系统加载它(如果你当然,已经配置了回退)。这是当 requirejs 看不到 404 返回时需要的东西。
  • jQuery 是全局可用的,因为它被声明为全局的。如果你简单地加载和执行 jQuery 脚本,你最终会得到两个全局变量,$jQuery (或者你可以像我那样做并避免这种情况)。内define()函数,您可以将 jQuery 别名为您想要的任何名称。
    define( [ 'jquery' ], function( jq ) {
        // jq is jquery inside this function. if you declared it 
        // globally it will be also available as $ and jQuery
    } );
    
  • 关于javascript - Require.js 正在伤害我的大脑。关于加载脚本/模块的方式的一些基本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11031485/

    相关文章:

    javascript - 为什么类方法在 React 组件中表现不正常?

    javascript - 对象的 ACE 编辑器自动完成

    javascript - addEventListener 点击不起作用

    javascript - 加载时间这么慢

    javascript - 如何将变量作为全局参数传递给 IIFE 函数?

    c - module_init 没有显示我想要的 printk

    jquery - 在 TD 的 IE8 中更改背景不透明度会删除边框...?

    javascript - jquery结合就绪和点击事件

    javascript - 将数据发送到 ExpressJS 服务器以渲染新 View

    javascript - NodeJS/Express 中的 "module.exports"和 "exports.methods"是什么意思?