升级至Rollup 3后@rollup/plugin-alias配置失效求助
问题场景
Rollup 2中使用rollup-plugin-import-alias的配置可正常运行:
alias({ Paths: { 'myfuncs': './src/js/node_modules/mylib/src/js/myfuncs', }, }),
升级到Rollup 3并改用官方的@rollup/plugin-alias后,配置改为:
alias({ entries: [ { find: 'myfuncs', replacement: './src/js/node_modules/mylib/src/js/myfuncs' }, ] }),
出现报错:
[!] Error: Could not load ./src/js/node_modules/mylib/src/js/myfuncs/
(imported by ../../../../d:/Dropbox/src/js/components/staticfunc.js):
EISDIR: illegal operation on a directory, read Error: Could not load
./src/js/node_modules/mylib/src/js/myfuncs/ (imported by
../../../../d:/Dropbox/src/js/components/staticfunc.js): EISDIR:
illegal operation on a directory, read
/src/js/位于Dropbox虚拟目录,Rollup 2下无异常。
问题原因
旧的rollup-plugin-import-alias会自动处理目录路径,默认查找目录下的入口文件(如index.js),而@rollup/plugin-alias的默认行为是直接替换路径,不会自动解析目录的入口文件,导致Rollup尝试读取目录而非文件,触发EISDIR错误。
解决方法
方法1:直接指定入口文件名
在replacement路径末尾加上目录的入口文件名(通常是index.js):
alias({ entries: [ { find: 'myfuncs', replacement: './src/js/node_modules/mylib/src/js/myfuncs/index.js' }, ] }),
方法2:使用Node模块解析器
借助@rollup/plugin-node-resolve的解析逻辑,让插件自动识别目录入口:
首先确保安装了@rollup/plugin-node-resolve,然后修改配置:
const { default: resolve } = require('@rollup/plugin-node-resolve'); const alias = require('@rollup/plugin-alias'); module.exports = { plugins: [ alias({ entries: [ { find: 'myfuncs', replacement: './src/js/node_modules/mylib/src/js/myfuncs' }, ], customResolver: resolve({ extensions: ['.js'] }) }), resolve() ] };
方法3:正则匹配补全路径
通过正则匹配myfuncs的导入,自动补全入口文件,同时支持子模块导入:
alias({ entries: [ { find: /^myfuncs$/, replacement: './src/js/node_modules/mylib/src/js/myfuncs/index.js' }, { find: /^myfuncs\/(.*)$/, replacement: './src/js/node_modules/mylib/src/js/myfuncs/$1' } ] }),
内容的提问来源于stack exchange,提问作者maidan

