一个 rollup.js 的插件,开启一个 web 服务然后返回 livereload.js;
插件另外依赖于 livereload-js;
cnpm 安装后功能正常,pnpm 则找不到文件;
补充:最终项目 A 依赖 rollup-plugin-monkey
,rollup-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里声明并且安装这个包