pnpm 下依赖项目真实路径的问题

问题遇到的现象和发生背景

一个 rollup.js 的插件,开启一个 web 服务然后返回 livereload.js;

插件另外依赖于 livereload-js;

cnpm 安装后功能正常,pnpm 则找不到文件;

补充:最终项目 A 依赖 rollup-plugin-monkeyrollup-plugin-monkey 依赖 livereload-js,而我是 rollup-plugin-monkey 的作者;

问题相关代码,请勿粘贴截图
// 路径获取
import path from 'path'
import { fileURLToPath } from 'url'

const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)

const monkeyPath = {
    base: path.resolve(__dirname, "../"),
    // 这里如何通用的获取真实路径
    liveJS: path.resolve(__dirname, "../node_modules/livereload-js/dist/livereload.js"),
}

// 路由
server.get('/livereload.js', function (req, reply) {
    // console.log(monkeyPath.liveJS)
    // reply.type('text/javascript').sendFile('livereload.js', monkeyPath.livePath)
    fs.readFile(monkeyPath.liveJS, (err, fileBuffer) => {
        reply.type('text/javascript').send(err || fileBuffer)
    })
})

我的解答思路和尝试过的方法

NodeProject/node_modules/rollup-plugin-monkey/dist/index.mjs

NodeProject/node_modules/rollup-plugin-monkey/node_modules/livereload-js/dist/livereload.js ← pnpm 安装并不存在这个路径

自己找到解决了:

cjs 中可以直接用 require.resolve,mjs 则需要绕点儿路用createRequire

Modules: node:module API | Node.js v18.8.0 Documentation
https://nodejs.org/api/module.html#modulecreaterequirefilename


import path from 'path'
import { fileURLToPath } from 'url'
import { createRequire } from 'node:module'

const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
const require = createRequire(import.meta.url)

const monkeyPath = {
  base: path.resolve(__dirname, '../'),
  liveJS: require.resolve('livereload-js'),
}

pnpm里你应该只使用在package.json里明确声明出来的包。其他的包在node_modules/.pnpm下的,不应该被代码中引用。
你想使用livereload-js的话需要在package.json里声明并且安装这个包