如何在另一个js文件中包含js文件?

IT技术 javascript
2021-01-21 21:10:01

我如何将一个js文件包含到另一个js文件中,以坚持DRY原则并避免代码重复。

4个回答

您只能在 HTML 页面中包含脚本文件,而不能在另一个脚本文件中包含。也就是说,您可以编写 JavaScript,将“包含的”脚本加载到同一页面中:

var imported = document.createElement('script');
imported.src = '/path/to/imported/script';
document.head.appendChild(imported);

您的代码很有可能取决于您的“包含”脚本,但是,在这种情况下它可能会失败,因为浏览器将异步加载“导入”脚本。最好的办法是简单地使用第三方库,如 jQuery 或 YUI,它会为您解决这个问题。

// jQuery
$.getScript('/path/to/imported/script.js', function()
{
    // script is now loaded and executed.
    // put your dependent JS here.
});
例如,如果您将使用 Google Chrome 开发者工具的“时间线”,您可以验证ok-soft-gmbh.com/jqGrid/iedeveloper.htm使用的document.writeln并行加载脚本并以相同的正确顺序执行(评估)。该页面是 XHTML,因此stackoverflow.com/questions/802854/...的第一个语句 也是错误的。所以没有发现的原因(我可以验证),为什么它是不好用document.writeln里面<script>放入<head>我希望有人给我寄一张。
2021-03-21 21:10:01
如果您提出第一个建议,则必须使用imported.onload级联脚本。但在这种情况下,我们继续遇到我描述的相同问题。
2021-03-22 21:10:01
我只能重复:在使用$.getScript情况下,第二个依赖脚本将在第一个加载和执行后开始加载它是顺序加载而不是并行加载此外,如果有人包含每个<script>这样的loader.js文件,这些文件加载了一些 JavaScript 库(例如考虑 jQuery UI),那么就不能只加载main.js在下一个<script>. 因此 JavaScript 库的使用将不会像往常一样容易。为了理解:我想使用这种方式,但应该提出更多建议以使其可行。
2021-03-28 21:10:01
根据这个文档developer.mozilla.org/en-US/docs/Web/HTML/Element/script with HTML5 你可以在使用 document.createElement() 强制加载同步时指定 async="false" 。这似乎可以解决使用此方法的问题。
2021-04-05 21:10:01
但是,当我使用 appendChild 之后的警报和作为插入脚本的第一行的警报对此进行测试时,来自插入脚本的警报排在第二位,因此它不是同步加载。
2021-04-11 21:10:01

我不同意这种document.write技术(见Vahan Margaryan 的建议)。我喜欢document.getElementsByTagName('head')[0].appendChild(...)(参见Matt Ball 的建议),但有一个重要问题:脚本执行顺序

最近,我花了很多时间重现一个类似的问题,甚至著名的 jQuery 插件也使用相同的技术(请参阅此处的src )来加载文件,但其他人也报告了该问题。想象一下,你有一个由许多脚本组成的 JavaScript 库,一个loader.js加载所有部分。有些部分是相互依赖的。想象一下,你有其他main.js每个脚本<script>,它使用从物体loader.js后,立即loader.js问题是有时main.js在所有脚本加载之前执行loader.js脚本$(document).ready(function () {/*code here*/});内部的使用main.js无济于事。级联onload事件处理程序在loader.js将使脚本加载顺序而不是并行,并使main.js脚本难以使用,脚本应该只是在loader.js.

通过在我的环境中重现该问题,我可以看到 **Internet Explorer 8 中脚本的执行顺序可能因包含 JavaScript* 而异。如果您需要包含相互依赖的脚本,这是一个非常困难的问题。并行加载 Javascript 文件中描述了该问题,建议的解决方法是使用document.writeln

document.writeln("<script type='text/javascript' src='Script1.js'></script>");
document.writeln("<script type='text/javascript' src='Script2.js'></script>");

因此,在“脚本并行下载但按写入页面的顺序执行”的情况下,从document.getElementsByTagName('head')[0].appendChild(...)技术更改为 后document.writeln,我再也没有看到这个问题。

所以我建议你使用document.writeln.

已更新:如果有人有兴趣,他们可以尝试负载(和重装)的页面在Internet Explorer(页面使用的document.getElementsByTagName('head')[0].appendChild(...)技术),然后用比较固定的版本使用document.writeln(页面代码比较脏,不是我写的,但可以用来复现问题)。

你需要写一个 document.write 对象:

document.write('<script type="text/javascript" src="file.js" ></script>');

并将其放在您的主要 javascript 文件中

@Matt:有趣的是,该问题的最高投票答案提倡将 document.write 用于简单的事情,例如加载脚本。
2021-03-17 21:10:01
+1 我不同意document.write. 我在我对问题的回答中写了更多信息。
2021-03-21 21:10:01
@Matt Ball:您说得对,但由于 Vahan 是新来的,您可能想解释原因。
2021-03-26 21:10:01
呃,请不要提倡使用document.write()
2021-04-05 21:10:01
@Konerak:这就是原因
2021-04-09 21:10:01

直接是不可能的。您也可以编写一些可以处理的预处理器。

如果我理解正确,那么以下是有助于实现这一目标的事情:

  • 使用一个预处理器,它会运行你的 JS 文件,例如寻找像“@import somefile.js”这样的模式,并将它们替换为实际文件的内容。Nicholas Zakas(雅虎)用 Java 编写了一个这样的库,您可以使用它(http://www.nczonline.net/blog/2009/09/22/introducing-combiner-a-javascriptcss-concatenation-tool/

  • 如果您使用的是 Ruby on Rails,那么您可以尝试使用 Jammit 资产打包,它使用 assets.yml 配置文件,您可以在其中定义可以包含多个文件的包,然后在您的实际网页中通过包名称引用它们。

  • 尝试使用像RequireJS这样的module加载器或像LabJs这样的脚本加载器,它们能够控制加载顺序并利用并行下载的优势。

JavaScript 目前不提供将 JavaScript 文件包含到另一个类似 CSS ( @import ) 的“本机”方式,但上述所有工具/方式都有助于实现您提到的 DRY 原则。我可以理解,如果您来自服务器端背景,它可能会感觉不直观,但事情就是这样。对于前端开发人员来说,这个问题通常是“部署和打包问题”。

希望能帮助到你。

你能举个例子吗?
2021-03-27 21:10:01
我编辑了我的答案以更好地解释我的想法。希望这次我够清楚了。
2021-04-05 21:10:01