Require.js是否有用于加载单个依赖项的同步版本

Does Require.js have a sync version for loading a single dependency?

本文关键字:依赖 同步 版本 单个 加载 js 是否 用于 Require      更新时间:2023-09-26

…这将启用此模式:

var $ = require('jQuery');

我正在查看Require.js文档,所能看到的只是回调版本,例如require(['jQuery'], function ($) { … });

Require提供了一个"CommonJS"模式,允许在代码中内联类似Node的Require语句。例如,这是一个典型的AMD定义,它将异步加载这些脚本:

define(['script1', 'script2'], function (script1, script2) {
});

但你也可以这样做:

define(function () {
   var script1 = require("script1");
   var script2 = require("script2");
});

Require也将异步处理这些。这样做的方法是,Require看到您没有指定依赖项数组作为第一个参数,然后扫描代码中的Require语句。然后,它异步地处理它们中的每一个。

然而,为了回答您的问题,如果您确实指定了一个依赖数组作为第一个参数,并且仍然使用CommonJS语法,Require将同步处理Require语句:

define([], function () {
    // Each of these scripts will be loaded synchronously
    var script1 = require("script1");
    var script2 = require("script2");
});

文档::

https://github.com/jrburke/requirejs/wiki/Differences-between-the-simplified-CommonJS-wrapper-and-standard-AMD-define

受浏览器限制,加载脚本只能是异步的。因此,在Require.js.中没有用于加载依赖项的同步版本

但是,有些模块加载程序确实有变通方法。例如,Sea.js提供了一个同步版本(http://seajs.org/docs/en.html#quick-start),通过运行regexp提取所有依赖项(https://github.com/seajs/seajs/blob/3d3c3bc142d9a6e3f6de14c1959d3f308b1c9e0e/src/module.js#L324)并在实际执行脚本之前异步加载它们。因此,依赖关系似乎是同步加载的。

看起来在开发过程中使用了sync变体:

require('foo')执行同步加载,require('foo', function(foo){ … })执行异步加载。在开发中,我们使用同步加载(方便是唯一的原因)-在生产中,RequireJS Optimizer内联无论如何都需要调用…

来源:https://github.com/rodneyrehm/viewport-units-buggyfill/issues/18#issuecomment-55604581