依赖性版本与依赖性版本

时间:2019-08-19 21:00:31

标签: node.js typescript package

假设我在ResponseError: illegal_argument_exception at IncomingMessage.<anonymous> (/Users/user/reference_sys_cfu-back/node_modules/@elastic/elasticsearch/lib/Transport.js:287:25) at IncomingMessage.emit (events.js:208:15) at IncomingMessage.EventEmitter.emit (domain.js:476:20) at endReadableNT (_stream_readable.js:1168:12) at processTicksAndRejections (internal/process/task_queues.js:77:11) { name: 'ResponseError', meta: { body: { error: [Object], status: 400 }, statusCode: 400, headers: { 'content-type': 'application/json; charset=UTF-8', 'content-length': '345' }, warnings: null, meta: { context: null, request: [Object], name: 'elasticsearch-js', connection: [Object], attempts: 0, aborted: false } } } 中有1.0版的依赖项XY中的1.0版的依赖项package.json。如果Y需要X 2.0版(我知道是因为我查看了package-lock.json),我仍然可以在代码中使用X 1.0版吗?< / p>

1 个答案:

答案 0 :(得分:1)

基于一些关于良好模块行为的假设,在同一应用中使用两个不同版本的模块是完全可行的。

以下是“良好行为”模块必须执行的一些操作:

  1. 请勿使用会在版本之间发生冲突的全局符号(仅适用于导出)。如果一切都通过模块导出完成,则同一模块的两个版本可以正常运行。每个都将单独导入,并且代码将仅使用来自相应版本的导入。
  2. 已将两个版本安装在不同的目录中或使用不同的名称。这里的想法是,模块之间的路径必须在两者之间不同,因为这就是模块缓存的工作方式。如果完整文件名不同(由于安装路径不同或文件名不同),则模块加载器将很乐意分别加载每个文件。
  3. 请勿在全局范围内注册任何可能会冲突的内容(例如不要同时尝试在同一端口上启动服务器)。
  4. 不要尝试将数据写入同一文件。如果所有文件活动都相对于模块的安装目录,那么这应该是安全的。但是,如果模块假设某个已知路径有关,或者两者都使用来自相同环境变量的路径,并且最终在将数据写入同一文件时发生冲突,则可能会引起问题。
  5. 不要尝试将冲突的属性名称写入同一对象。例如,如果两个版本都充当Express中间件,并且都试图将不同的内容写到req.someProp属性中,这可能会导致问题。但是,如果两个版本都没有在相同的请求上使用,或者两个版本都用于不同的功能,那么这可能就可以了。
  

我仍然可以在代码中使用X版本1.0而不出现问题吗?

因此,这当然是可能的,但这取决于模块的行为以及模块在全局或共享资源下的确切功能。