我编写了 JavaScript 库来使用文件保存器.js及其相关的库。但是,我不想在有人想要使用我的库时总是加载 FileSaver.js。我不想强迫他们加载所有与 FileSaver 相关的 JavaScript 库script
标签本身(或者甚至加载我的一个标签来做到这一点)。
相反,我更喜欢的是这样的。当他们打电话给我时createImage
函数,它首先执行以下操作:
function createImage(image, name) {
if (typeof(saveAs) !== 'function') {
var element = document.createElement('script');
element.async = false;
element.src = 'FileSaver.js';
element.type = 'text/javascript';
(document.getElementsByTagName('head')[0]||document.body).appendChild(element);
}
// now do the saveImage code
}
问题是,经过上述之后,saveAs
函数尚未定义。这只是after my createImage
完成的是saveAs
函数最终定义。
整体解决方案是使用模块系统。 AMD(在我的观察中,请不要开始一场圣战意见)可能是浏览器异步代码加载最常用的系统。 AMD 只是一个规格,但类似需要.js是一个非常流行的使用 AMD 模块的工具。
这个想法是,您可以定义模块之间的依赖关系,并且 require.js 将在需要时获取它们。总体思路是模仿其他语言(如 java、C# 或 python)的导入/命名空间功能。 “代码共享”我认为是这个词?
只需将所有代码放在回调函数中,该函数在加载依赖项后运行,这样您就可以确保所需的对象和方法都存在。
更新2015
只是一个附录。虽然上面的信息仍然正确,但前端代码管理正在快速转向 Webpack 和 Browserify 等解决方案,它们捆绑和连接任何模块类型的代码,并且都具有动态代码加载功能(webpack 称之为代码分割)。再加上用于依赖管理的 npm 的指数级增长,AMD 的相关性开始下降。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)