导入 NPM 模块,即使该模块未在本地安装或未定义为项目依赖。如果存在本地安装的包,则使用该包。否则,将按需动态下载该包。
安装
安装模块
npm install @wordpress/lazy-import --save
该包假定你的代码将运行在 ES2015+ 环境中。如果你使用的环境对此类语言特性和 API 的支持有限或完全不支持,则应在代码中包含 @wordpress/babel-preset-default 附带的 polyfill。
要求
需要 NPM 6.9.0 或更高版本,因为它使用 包别名特性 来维护同一个包的多个版本。
用法
其用法旨在模拟 动态 import 函数 的行为,接收 NPM 包的名称(以及可选的版本说明符),并返回一个解析为所需模块的 Promise。
注意:目前,这种与 import 的一致性只是表面上的,模块解析仍然使用 CommonJS require,而不是较新的 ES Modules 支持。一旦 Node.js 的 LTS 版本包含无需标志的 ES Modules 支持,该包的未来版本可能会支持 ES Modules。
传递给 lazyImport 的字符串可以完全按照你提供给 npm install 的格式,包括可选的版本说明符(包括 版本范围)。如果省略版本说明符,则将其视为等同于 *;如果存在本地安装的包,则使用该包的版本,否则安装最新的可用版本。
const lazyImport = require( '@wordpress/lazy-import' );
lazyImport( 'is-equal-shallow@^0.1.3' ).then( ( isEqualShallow ) => {
console.log( isEqualShallow( { a: true, b: true }, { a: true, b: true } ) );
// true
} );
如果你使用的是 Node v14.3.0 或更高版本,还可以利用 顶层 await 来简化顶层导入:
const lazyImport = require( '@wordpress/lazy-import' );
const isEqualShallow = await lazyImport( 'is-equal-shallow@^0.1.3' );
console.log( isEqualShallow( { a: true, b: true }, { a: true, b: true } ) );
// true
lazyImport 可选地接受第二个参数,即选项对象:
const lazyImport = require( '@wordpress/lazy-import' );
function onInstall() {
console.log( 'Installing…' );
}
lazyImport( 'fbjs@^1.0.0', {
localPath: './lib/shallowEqual',
onInstall,
} ).then( /* ... */ );
请注意,当处于离线状态且无法使用 NPM 安装依赖时,lazyImport 可能会抛出错误。你可能需要预料到这种情况,并为安装失败提供补救步骤,例如记录警告信息:
try {
await lazyImport( 'is-equal-shallow@^0.1.3' );
} catch ( error ) {
if ( error.code === 'ENOTFOUND' ) {
console.log( 'Unable to connect to NPM registry!' );
}
}
选项
localPath
- 类型:
string - 是否必需:否
本地路径,指向当需要导入 main 以外的其他脚本时可使用的文件或目录。
onInstall
- 类型:
Function - 是否必需:否
如果模块需要安装,则会在安装过程中调用该函数。由于安装可能导致脚本执行延迟,这对于输出日志信息或显示加载指示器很有用。
一旦返回的 Promise 完成解析,即可认为安装已完成。
为本包做贡献
这是一个独立包,属于 Gutenberg 项目。该项目以单一仓库(monorepo)的形式组织。它由多个自包含的软件包组成,每个包都有特定用途。该单一仓库中的包发布到 npm,并被 WordPress 以及其他软件项目使用。
要了解更多关于为本包或整个 Gutenberg 做贡献的信息,请阅读项目的主要 贡献者指南。