javascript - 与 Rollup 捆绑时忽略或替换依赖项的导入
问题描述
我正在使用 Rollup 捆绑一个 JS 库。这个库依赖于@tensorflow/tfjs-core。
在 tfjs 的代码中,有一个获取 URL 的函数。如果是在浏览器环境中,则使用全局fetch
函数;如果不是,它会尝试导入node-fetch
.
这些行中的一些东西:
fetch(path: string, requestInits?: RequestInit): Promise<Response> {
if (env().global.fetch != null) {
return env().global.fetch(path, requestInits);
}
if (systemFetch == null) {
systemFetch = require('node-fetch');
}
return systemFetch(path, requestInits);
}
我的库是在浏览器中运行的,所以它总是使用全局fetch
函数。但是,Rollup 仍然node-fetch
在我的 lib 资产中捆绑了 require 。
这应该不是问题,但是一些消费者在使用 webpack 的 React 项目中使用该库时会报告错误:
编译失败。
./node_modules/[my lib]/index.js 找不到模块:'node-fetch'。确保已安装此软件包。
你可以通过运行:npm install node-fetch 来安装这个包。
问题是:有什么方法可以告诉 Rollup 不是没有捆绑包吗?
我想过在生成捆绑包后替换require('node-fetch')
by undefined
,但感觉就像一个肮脏的黑客。还有什么建议吗?
PS:我相信标记node-fetch
为external
消费者项目可以解决问题,但由于我不在node-fetch
我的库中使用,所以最好将其从最终输出中删除。
解决方案
其他包管理器可以包含或排除基于环境的文件test
,development
, production
, 等。
有很多方法可以实现这一点,甚至可以做到
# Makefile
ENVIRONMENT ?= test
ROLLUP = $(which rollup)
ENVSUBST = $(which envsubst)
rollup.config.js: src/$(ENVIRONMENT)
${ENVSUBST} < $@ > $^
${ROLLUP} $^ -o $(ENVIRONMENT).js
如果您创建了以您的环境命名的文件,您可以使用
make -e environment=browser
我不希望我的代码能够工作,只是为了表达想法。
推荐阅读
- swift - 我的完成处理程序总是返回一个空数组,为什么?
- oracle - 想要根据 DAY 差异对数据进行四舍五入
- javascript - 通过 Chrome 执行 bat 文件
- google-cloud-platform - 在 GCP 上选择正确的云存储选项
- excel - SUMPRODUCT 在 Excel 的下拉列表中具有重复值
- c# - Task.Run 不像 Thread.start 那样工作
- javascript - 使用正则表达式在字符串 html 中查找链接
- excel - 我无法使用 Angular2 读取 Excel
- ruby-on-rails - 标识符 '(function(opts, pluginOpts) {return eval(process' undefined - ExecJS::ProgramError in Home#index
- jquery - 错误:路径与磁盘上的相应路径不匹配