如何让Rollup完全忽略request-promise模块?跨端库构建求助
解决Rollup忽略/替换request-promise模块的问题
我来帮你搞定这个跨环境库的Rollup配置问题!你需要的是让Rollup完全移除对request-promise的依赖,甚至把它替换成null,之前的方法没生效大概率是配置细节没到位,下面给你几个可靠的解决方案:
方案1:用rollup-plugin-ignore的正确配置
你之前试过这个插件,但可能没考虑到导入的不同形式。如果你的代码里同时存在ES模块导入和CommonJS的require,需要明确配置让插件覆盖两种情况:
import ignore from 'rollup-plugin-ignore'; export default { // 你的其他Rollup配置(比如input、output等) plugins: [ ignore({ modules: ['request-promise'], // 处理CommonJS的动态require调用 ignoreDynamicRequires: true }) ] };
这个配置会把所有对request-promise的导入语句替换成空对象,结合你的环境检测逻辑,浏览器端不会触发Node.js分支的代码,完全不会有问题。
方案2:用@rollup/plugin-virtual创建虚拟模块
如果需要更精准地替换成null,可以用虚拟模块插件,直接把request-promise指向一个自定义的虚拟文件:
import virtual from '@rollup/plugin-virtual'; export default { // 你的其他Rollup配置 plugins: [ virtual({ 'request-promise': 'export default null;' }) ] };
这样Rollup会把所有导入request-promise的地方,直接替换成这个虚拟模块的内容——也就是导出null,完全不会打包真实的request-promise模块。
方案3:分环境打包(结合external和@rollup/plugin-replace)
如果需要单独构建浏览器版和Node.js版,可以通过环境变量配合替换逻辑:
- 先保留代码里的环境检测逻辑:
let requestHandler; if (typeof window !== 'undefined') { // 浏览器端的XMLHttpRequest逻辑 requestHandler = /* 你的浏览器请求实现 */; } else { // Node.js端用request-promise const rp = require('request-promise'); requestHandler = rp; }
- 然后在Rollup配置中针对浏览器环境替换Node.js分支代码:
import replace from '@rollup/plugin-replace'; export default { // 你的其他Rollup配置 plugins: [ replace({ // 把Node.js分支的代码替换成空实现 "const rp = require('request-promise'); requestHandler = rp;" : "requestHandler = null;", preventAssignment: true }), // 标记request-promise为外部依赖,不打包进浏览器版本 external: ['request-promise'] ] };
为什么之前的方法没生效?
external: ['request-promise']只会让Rollup不打包该模块,但会保留导入/require语句,浏览器环境下会报错;rollup-plugin-ignore如果没加ignoreDynamicRequires: true,无法处理CommonJS的require调用;hypothetical插件的路径可能没匹配到request-promise的真实入口文件,导致替换失败。
优先试试方案2,它最直接,能精准把request-promise替换成null,完美适配你的需求。
内容的提问来源于stack exchange,提问作者Alexandre Germain
相关产品推荐
相关产品推荐

