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

可能重复:
在.js文件中包含.js文件

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


您只能在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.
});

我不同意批评document.write技术(见Vahan Margaryan的建议)。 我喜欢document.getElementsByTagName('head')[0].appendChild(...) (请参阅Matt Ball的建议)的方式,但有一个重要问题:方式中包含脚本的执行顺序 。 我必须在下面更详细地描述这个问题。

最近我花了很多时间来重现一个密切的问题。 众所周知,jQuery插件使用相同的技术(请参阅src)来加载文件,但不同的人员报告了此问题。 我可以将问题描述如下。 让我们来创建一个由多个脚本和一个loader.js组成的JavaScript库,并加载所有的部分。 一部分来自另一部分。 让我们你有另一main.js每个脚本<script>它使用来自对象loader.js后立即loader.js 。 问题是,有时,在main.js被加载的所有脚本之前执行loader.js$(document).ready(function () {/*code here*/}); main.js脚本内部也可能没有帮助。 在loader.js使用级联onload事件处理程序将遵循顺序而不是并行加载脚本,并且会使使用main.js脚本困难, main.js脚本应该只包含在loader.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 。 (该页面的代码相对较脏,不是来自我的,但它可以用来重现我所描述的问题)。


这是不可能的。 你可以写一些可以处理的预处理器。

如果我理解正确,那么下面的内容可以帮助实现这一点:

  • 使用一个预处理器,它将运行你的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这样的模块加载器或像LabJs这样的脚本加载器来控制加载顺序以及利用并行下载。

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

    希望能帮助到你。

    链接地址: http://www.djcxy.com/p/42529.html

    上一篇: How to include js file in another js file?

    下一篇: Can multiple versions of a same (Boost) DLL co