gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:04:40 25 4
gpt4 key购买 nike

让我们假设这是我的 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com