我正在做一些类似查询的事情,并且能够使其能够使用任何模块,如mysql、mssql等来支持我的工作,如果可能的话,将其共享到npm库。
目前,我必须安装所有这些,最后我得到了一堆
mysql2
、mssql
、tedious
和pgsql
。他们占用了大量不必要的资源。
但是,尽管我已经安装了
easy-query-mysql
,例如,在我的应用程序中与 easy-query
一起安装,easy-query
仍然无法导入它。也许nodejs方面有一些隔离。
我尝试让它尝试像
easy-query-mysql
一样导入,如果找不到适配器则跳过适配器。所以它是这样的:
app
|- node_modules
| |- easy-query
| | |- index.js
| |- easy-query-mysql
|- index.js
/app/index.js
const query = await EasyQuery.connect('mysql://user:pass@localhost/database');
/app/node_modules/easy-query/index.js
const adapter = await import('easy-query-mysql`)
产量
ERR_MODULE_NOT_FOUND
在 import('easy-query-mysql')
我想知道,是否可以让用户只安装他们需要的模块?例如,假设我的包是
easy-query
,但它没有附带任何模块。然后,如果用户将 easy-query\mysql
添加到他们的项目中,例如使用 npm i easy-query easy-query\mysql
之类的内容,那么 easy-query
将能够接受像 mysql://dbuser:passwd@localhost/database
这样的连接。如果用户添加 easy-query\mssql
,那么用户将能够连接到 mssql://dbuser:passwd@localhost/database
,依此类推
如果可能的话,如何构建我的项目才能做到这一点?我可以阅读有关如何执行此操作的任何资源吗?
您可以在 package.json 的
peerDependencies
中添加额外的软件包,并在 peerDependenciesMeta
部分将它们添加为可选,这样它就不会自动安装它们。
"peerDependencies": {
"easy-query-mysql": ">= 1.0.0"
},
"peerDependenciesMeta": {
"easy-query-mysql": {
"optional": true
}
}
您无法控制将安装哪个版本,因此不要指定确切的版本,而是根据您的支持使用逻辑操作。
在您的代码中,您需要处理不同的可选情况。
let easy-query-mysql;
try {
easy-query-mysql = await import('easy-query-mysql')
} catch (er) {
easy-query-mysql = null;
}
if (easy-query-mysql) {
// Whatever you want
}