【问题标题】:Load Javascript like PHP's include加载 Javascript,如 PHP 的 include
【发布时间】:2013-04-24 05:50:17
【问题描述】:

今天我想问一些我不敢相信在网上找到的东西。

我正在尝试创建一个 javascript 函数,它允许我提供文件名/路径名作为参数,并且该函数返回将立即执行/初始化的 javascript 代码 - 就像 PHP 的 include 或 require 一样。

现在我尝试了几种技术来实现我的方法,但我只是没有找到正确的位置,所以我可能会问:在 JS 中甚至可以做到这一点吗?

提前致谢

【问题讨论】:

  • 你需要同步ajax和<script>...</script>标签注入。 ExtJS 通过这种技术工作。
  • 我知道这些方法,但不完全是我想要的:S
  • requirejs 怎么样?
  • 但是我怎么看,不可能通过这样加载来初始化函数?如果我在用户单击某些内容后删除或添加标签怎么办,那么是否可以在生成的脚本标签的文件中使用函数?

标签: php javascript module include require


【解决方案1】:

有许多库和标准仅用于此目的。在 Node.js 中,内置了一个 CommonJS 实现。如果您想从文件中导出一段代码,或文件的全部内容,您可以将其附加到module.exports 或简单的exports 对象。然后,您可以使用require('./path/to/file'); 在单独的代码中要求它。

一些库试图借用这种方法并在客户端实现它,browserify 就是其中之一。

但是,最好看看它们中最好的客户端库:RequireJS

RequireJS 实现了所谓的异步模块定义模式,它将所有项目依赖项加载到一个顶级文件中。它使您可以访问两个函数,require()define(),它们需要一些参数。第一个函数只需要依赖项,而第二个函数定义一个模块和名称的模块依赖项,如下所示:

一个没有定义模块的顶级文件,只使用它们:

require(['jquery', 'underscore', 'backbone'], // dependencies
  function($, _, Backbone) { // dependencies are passed into callback
    $('div').append('Test'); // dependencies are available to this file
  }
);

一个模块:

define(['jquery', 'underscore', 'backbone'], // this module's dependencies
  function($, _, Backbone) { // dependencies are made available
    var MyModule = {};
    return MyModule; // this return statement essentially defines the module
  }
);

这种方法的好处在于,通过拥有一个顶级文件和几个模块,它们都定义了它们自己的依赖项,你只需要引用一个模块,如果它实际上是该文件的依赖项,所以你的顶级东西总是干净整洁的,通常只包含一个初始化函数。

RequireJS 还附带了一个名为 R.js 的优化器,它可以使用 UglifyJS 或 Google 的 Closure Compiler 以正确的顺序缩小和连接您的脚本。值得一试。

【讨论】:

  • 谢谢,我想我会检查一下 require 似乎是一个很好的解决方案!
  • 最后一个问题:是否有可能使函数在 require 回调函数之外可用,或者它只能在该函数内部使用?
  • 据我了解,它仅在该函数内部可用。不过,我从来不需要对 RequireJS 做更多的事情来保证找出该声明中的任何真相,因此可能有一些理由来检查它。关于 RequireJS 的事情是,通过设计,它可以防止您污染全局范围。但是,如果您在一个模块中定义了一个依赖项,并使该模块成为另一个模块的依赖项,则第二个模块可以访问第一个模块的依赖项,而无需定义它们。
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2013-07-08
  • 2013-05-31
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多