dojo dragon main logo

外部依赖

无法正常捆绑的非模块化库或独立应用程序可以通过在需要时提供 requiredefine 的实现,以及在项目 .dojorc 文件中进行一些配置来包含在 Dojo 应用程序中。

外部依赖项的配置可以在 build-app 配置的 externals 属性下提供。externals 是一个对象,它有两个允许的属性

  • outputPath:一个可选属性,指定应将文件复制到的输出路径。
  • dependencies:一个必需的数组,定义哪些模块应该通过外部加载器加载,以及哪些文件应该包含在构建中。每个条目可以是以下两种类型之一
    • 一个字符串,表示此路径及其所有子路径应该通过外部加载器加载。
    • 一个对象,为需要复制到构建应用程序中的依赖项提供额外的配置。此对象具有以下属性
属性 类型 可选 描述
from 字符串 相对于项目根目录的路径,指定要复制到构建应用程序中的文件或文件夹的位置。
to 字符串 一个路径,用作 from 的替代位置,用于将此依赖项复制到该位置。默认情况下,依赖项将被复制到 ${externalsOutputPath}/${to}${externalsOutputPath}/${from}(如果未指定 to)。如果路径中存在任何 . 字符,并且它是一个目录,则它需要以正斜杠结尾。
name 字符串 模块 ID 或应用程序源代码中引用的全局变量的名称。
inject 字符串、字符串数组或布尔值 此属性表示此依赖项定义或包含应在页面上加载的脚本或样式表。如果 inject 设置为 true,则 tofrom 指定的位置处的文件将在页面上加载。如果此依赖项是一个文件夹,则 inject 可以设置为字符串或字符串数组,以定义一个或多个要注入的文件。inject 中的每个路径都应相对于 ${externalsOutputPath}/${to}${externalsOutputPath}/${from}(取决于是否提供了 to)。
type 'root' 或 'umd' 或 'amd' 或 'commonjs' 或 'commonjs2' 强制此模块使用特定的解析方法。对于 AMD 风格的 require,使用 umdamd。对于 node 风格的 require,使用 commonjs,要访问对象作为全局变量,使用 root

例如,以下配置将 src/legacy/layer.js 注入到应用程序页面,注入定义 MyGlobal 全局变量的文件,声明模块 ab 是外部的,应该委托给外部层,然后复制文件夹 node_modules/legacy-dep,从中注入几个文件。所有这些文件都将被复制到 externals 文件夹,可以通过在 externals 配置中指定 outputPath 属性来覆盖它。

{
	"build-app": {
		"externals": {
			"dependencies": [
				"a",
				"b",
				{
					"from": "node_modules/GlobalLibrary.js",
					"to": "GlobalLibrary.js",
					"name": "MyGlobal",
					"inject": true
				},
				{ "from": "src/legacy/layer.js", "to": "legacy/layer.js", "inject": true },
				{
					"from": "node_modules/legacy-dep",
					"to": "legacy-dep/",
					"inject": ["moduleA/layer.js", "moduleA/layer.css", "moduleB/layer.js"]
				}
			]
		}
	}
}

externals 中包含的任何依赖项的类型都可以安装在 node_modules/@types 中,就像任何其他依赖项一样。

由于这些文件是主构建的外部文件,因此在生产构建中不会对文件进行版本控制或哈希处理,除了对任何 injected 资产的链接除外。to 属性可用于指定一个版本化的目录,将依赖项复制到该目录,以避免缓存不同版本的相同文件。