动态加载的 JavaScript 库何时可用?

2023-12-10

我编写了 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(使用前将#替换为@)

动态加载的 JavaScript 库何时可用? 的相关文章

随机推荐

  • MySQL 使用 LIKE 搜索带空格的字符串

    我正在我的网站上建立一个搜索 我注意到当您在搜索中输入多个单词时它不起作用 这是查询的要点 SELECT FROM blog WHERE content LIKE keyword OR title LIKE keyword ORDER BY
  • 如何用 C# 制作字体组合框?

    我想在 c NET 4 5 Windows 窗体应用程序 注意 不是 WPF 中创建一个组合框 它显示系统上所有 truetype 安装的字体 并且每个字体都使用它所代表的字体进行格式化 Times 使用 Times 进行格式化 Arial
  • Visual C++:将int转换为字符串指针

    如何在 Visual C 中将整数转换为字符串指针 使用字符串流 include
  • 从 TSQL 调用 Web 服务的最佳方式

    从 TSQL 调用 Web 服务的最佳方式是什么 我想编写一些调用网络服务的触发器 有没有普遍使用的最佳实践 需要在 SQL Server 2005 和 2008 中处理实现 从我所听到的一切来看 从数 据库 内 的任何地方进行网站调用都不
  • 当位置为负数时如何有滚动条?

    当位置为正时 滚动条可以正常工作 但当 left 为负数时 滚动条不会出现 当元素位于左侧或右侧时 如何才能有滚动条 样本在这里 container position relative width 350px height 250px ba
  • 多维数组差异

    我有 2 个数组 big array array array array correct gt FALSE answer gt false answer1 array correct gt FALSE
  • 序列A中的A代表什么?

    什么是sequenceATraversable 代表什么 为什么最后是大写A 我已经学习 Haskell 几个月了 这是困扰我一段时间的事情之一 A 代表Applicative 如在约束中sequenceA s type sequenceA
  • 字符串资源换行 /n 不可能吗?

    似乎无法添加新行 n到 XML 资源字符串 还有另一种方法可以做到这一点吗 使用反斜杠而不是正斜杠 n
  • Flutter:使用凭据发布请求

    如何从 flutter 发出发布请求 我需要使用用户的电子邮件地址和密码对用户进行身份验证 请帮忙 尝试使用以下代码 http post url body email email password password then respons
  • 使用按位运算符更改符号

    如何使用按位运算符更改 int 的符号 显然我们可以使用x 1 or x 1 有没有最快的方法来做到这一点 我做了一个小测试 如下所示 只是为了好奇 public class ChangeSign public static void ma
  • IOError: [Errno 输入溢出] -9981

    我试图在 Raspberry Pi B 型板上的 Raspbian 上执行 PyAudio python 捕获程序 但出现错误 Traceback most recent call last File home pi pythonsound
  • 为什么Python3中没有xrange函数?

    最近我开始使用Python3 它缺乏xrange hurts 简单的例子 Python2 from time import time as t def count st t x for x in xrange 10000000 if x 4
  • 在 Laravel 5 中使用 Google Drive Api

    我是 Laravel 的新手 当然这个问题有一个明显的答案 但我无法将 Laravel 5 与 Google Api 连接起来 我像往常一样使用 Composer 安装了 Api 它位于我的供应商文件夹中 但现在我不知道如何使用它 我还没有
  • 保存 WooCommerce 订单上产品属性的自定义交货日期

    我有一个自定义属性 其中产品有不同的取货时间 我想将此日期作为自定义字段添加到我的厕所订单中 以通过 cronjob 通知我的客户订单已准备好取货 使用下面的代码我得到了错误的日期 有人能告诉我这里出了什么问题吗 foreach order
  • Node.js——如何以最快的方式获取 Google Drive API 的内容

    我正在尝试使用 Node js 和 Google Drive API 制作一个网站 为此 在从 google 获取 API 密钥后 我可以访问如下链接 https www googleapis com drive v3 files q 27
  • 如何在 Angular 4 中获取 HttpClient 状态代码

    在Http模块中 我可以使用response status轻松获取响应代码 但是当我使用HttpClient模块时 我无法获取response status 它显示未定义 那么 我如何使用 Angular 4 中的 HttpClient 模
  • 如何使用 Angularjs 制作级联下拉菜单?

    在这里 我添加了带有子型号的移动品牌名称列表 我的期望 1 这里多次列出诺基亚和三星 HTC 如何避免列表中重复出现相同的名称2 当我在第一个下拉列表中选择诺基亚时 一个新的下拉列表应出现在第一个下拉列表中 它应显示诺基亚品牌型号列表 如果
  • 动态 JComboBox

    我有以下数据 字符串 Course1 A1 Course1 A2 Course2 B1 Course2 B2 Course2 B3 Course2 B4 Course3 C1 Course3 C2 我想创建两个J组合框 JComboBox1
  • Spark Dataframe:从 Map 类型生成元组数组

    我的下游源不支持 Map 类型 而我的源支持 Map 类型 因此发送此类型 我需要将此映射转换为结构数组 元组 Scala 支持 Map toArray 它为您创建一个元组数组 这似乎是我需要在 Map 上进行转换的函数 a b key1
  • 动态加载的 JavaScript 库何时可用?

    我编写了 JavaScript 库来使用文件保存器 js及其相关的库 但是 我不想在有人想要使用我的库时总是加载 FileSaver js 我不想强迫他们加载所有与 FileSaver 相关的 JavaScript 库script标签本身