你应该将IIFE与RequireJS一起使用

Should you use IIFE with RequireJS

本文关键字:RequireJS 一起 IIFE      更新时间:2023-09-26
似乎

如果您使用的是 RequireJS 并且使用 definerequire ,那么使用 IIFE 也没有意义,因为每个模块都已经包装在 define/require 中。是这样吗?

换句话说,这段代码

define(['app'], function(app)
{
    app.run();
});

有任何差异/优势

(function() { 
    define(['app'], function(app) 
    {
        app.run();
    });
})();

一般来说,你不需要将IIFE与RequireJS一起使用,但有时你应该这样做。

如果您使用通常的define([... deps ...], function (...) {...})格式,那么您只是从全局空间读取define,并且您所做的所有其他内容都封装在您传递给define的函数中。无论有没有 IIFE,您都可以泄露您想要泄露的内容并保持您想要保密的内容的私密性。

如果您正在编写希望能够在使用和不使用 RequireJS 的情况下运行的代码,则通常需要 IIFE。例如,这个:

(function () {
    'use strict';
    function factory () {
        // Build our module...
        return something;
    }
    if (typeof define === 'function' && define.amd)
        define([], factory); // AMD environment: call define.
    else
        window.Foo = factory(); // Otherwise, leak into the global space.
})();

流行的库(例如jQuery)通常具有这样的代码,允许将它们与RequireJS(或其他AMD加载程序)和script元素一起使用。这是非常普遍的。使用 IIFE 可以将factory功能排除在全局空间之外。

无论如何,define()函数都在全局范围内,因此在 IIFE 中调用它根本没有区别,而且有点多余。

如果将代码放在define回调之外,情况会有所不同,但不应这样做,因为每个文件都应表示一个封装的模块。

我唯一能想到将 IIFE 与 RequireJS 一起使用的时间可能是当我通过在初始化之前调用require.config()来配置我的应用程序时;但即便如此,如果我只是调用require.config()并且外部没有任何代码,我仍然不会使用 IIFE。

在此示例中,无需使用 IIFE:https://github.com/vasilionjea/bower-requirejs-starter/blob/master/local/js/main.js

我希望这能回答你的问题。