在JavaScript中实现脚本import指令

在编写JavaScript时候,无论项目大小,都应该对所有*.js文件就行管理,尤其是面向对象的项目中。应该如Java一样,将每个类独立出来。但有个问题是JavaScript不支持脚本导入,这使得这个工作变得非常麻烦。

目前我找到了两种方式来做这个工作,即在JavaScript中模拟出import指令的功能。

  • XMLHTTPRequest对象 + eval();
  • 创建<script>标签以及src属性

两种方式各有千秋。dojo中实现了两个方法:

  • 模拟import的dojo.require();
  • 模拟package的dojo.provide();

研究了一下代码,不过还是没弄明白它是怎么来实现这个dojo.require()的,不过应该可以肯定的是它没有使用创建<script>的方法,因为在生成的页面中没有额外的<script>。

前一阵把神奇一刻的JavaScript都规整了一下,建了个DisneyBox类和众多的子类,脚本的导入使用了创建<script>的方法。那么现在就分别介绍一下两中方法吧,其实都是很简单的一些技巧。

XMLHTTPRequest对象 + eval()函数

这种方法的原理如下:

  1. 利用XMLHTTPRequest对象把*.js文件以文本方式加载进来,并保存在responseText中
  2. 使用eval()函数将responseText中的文本转换成JavaScript脚本

这样做的好处是载入的脚本立即可以执行,但有可能会遇到很多eval()函数的问题,并且不能跨域引用。

创建<script>标签

原理如下:

  1. 用document.createElement(’script’)方法创建一个script元素
  2. 设置script元素的type和src属性
  3. 将此script元素用appendChild()方法添加到HTML文档中

这种方法的好处是能够比较安全的导入脚本,不需要再利用eval()来解析,但这样会在HTML中引入过多的文件,而且会有其他一些问题。

这里还有一篇很值得看的文章:Qomolangma实现篇(一):内核载入模块system.js的实现。对这两种方法做了更详细的叙述。

JavaScript 2.0的提案中引入了package的概念,而且提供了package和import指令,拭目以待它的实现吧。

留言: