如何在其他js文件中包含js文件?

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

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

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

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

有一个很好的机会,你的代码依赖于你的“包含”脚本,但在这种情况下,它可能会失败,因为浏览器将asynchronous加载“导入”脚本。 你最好的select就是简单地使用像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的build议 )。 我喜欢document.getElementsByTagName('head')[0].appendChild(...) (请参阅Matt Ball的build议 )的方式,但是有一个重要的问题:包含在脚本中的脚本的执行顺序 。 我必须在下面更详细地描述这个问题。

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

我可以在我的环境中重现此问题,并可以看到在Internet Explorer 8中执行脚本的顺序可以是包含JavaScript的顺序 。 如果你需要包含一些从另一个依赖的脚本,这是非常困难的问题。 这个问题在并行加载Javascript文件中有描述。 由于解决方法build议使用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我从来没有看到任何问题更多。

所以我build议你使用document.writeln

更新 :如果有人有兴趣,他可以尝试加载(并重新加载)在Internet Explorer中的页面(该页面使用document.getElementsByTagName('head')[0].appendChild(...)技术),并与固定版本使用document.writeln 。 (页面的代码是相对脏的,不是来自我,但它可以用来重现我所描述的问题)。

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

如果我理解正确,那么下面是可以帮助实现的事情:

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

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

  • 尝试使用像RequireJS这样的模块加载器或像LabJs这样的脚本加载器来控制加载顺序以及利用并行下载。

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

希望能帮助到你。

你需要这样写

 document.write('<scr'+'ipt type="text/javascript" src="other js file.js" ></scr'+'ipt>'); 

在你的第一个js文件