跨多个文件的 IIFE

IIFE across multiple files

是否可以在同一个 IIFE 中将 javascript 代码定义在 2 个或多个单独的文件中 运行?我愿意使用像 gulp 这样的构建工具来完成这个。

这似乎是一个很普通的问题。我希望我的代码被组织起来并分成它们自己的文件(顺便说一句,不同的淘汰赛视图模型)。但我希望它们都在同一个函数中 运行 而不是污染全局。

现代的方法是使用 modules 而不是尝试将所有内容都放入 IIFE 中。现在,使用模块意味着使用像 RequireJS、SystemJS、Webpack、Browserify 等模块捆绑器。在 medium-term 未来,如果你愿意,你将能够直接在浏览器中使用 ES2015+ 模块,或者再次使用捆绑器将它们捆绑到一个文件中。 (你现在可以将 ES2015+ 模块 syntax 与像 Babel 这样的转译器一起使用,但你仍然需要一个打包器。)

您提到您目前正在使用 RequireJS 但未使用其 define 功能。仅出于说明的目的,这里是 粗略地 定义模块的方式(我不喜欢 Require 的语法,但你可以使用 Babel 将 ES2015 语法转换为它):

假设我有一个定义 KO 组件的模块:

define("my-component", ["ko"], function(ko) {
    // ...define the component...

    // Return it
    return MyComponent;
});

那个:

  1. 表示模块名为 my-component(模块名称是可选的,因此例如应用程序的 top-level 模块不需要名称)
  2. 说它依赖于模块ko(提供Knockout);请注意该依赖项是如何作为参数提供给您用于定义模块的回调的
  3. Returns MyComponent 作为模块定义的 top-level 东西

然后在我的应用程序中:

define(["my-component", "another-component"], function(MyComponent, AnotherComponent) {
    // use MyComponent and AnotherComponent here
});

您还可以让模块将常用的其他模块组合在一起,以简化操作。

在 ES2015+ 语法中改为:

my-component.js:

import ko from "./ko";
// ...define MyComponent...
export default MyComponent;

app.js:

import MyComponent from "./my-component";
import AnotherComponent from "./another-component";

// ...use them...

显然,这两个示例都非常 简化了,您还可以做很多事情。

这是两个不同的问题。

  1. 一个 IIFE 可以跨越多个文件 - 不能!
  2. 可以 classes/functions/etc 在多个文件中不污染全局范围 - 是的!

文件 1

var myNS = {};

文件2

myNS.MyViewModel = function(){ ... }

文件 3

myNS.OtherViewModel = function() { ... }

作为一个非常简单的例子,其中有101种方法可以实现。