Dependencies 在rollup ESM库中导入uuid会为“创建导入语句”;“加密”;在输出文件中

Dependencies 在rollup ESM库中导入uuid会为“创建导入语句”;“加密”;在输出文件中,dependencies,uuid,guid,cryptojs,rollup,Dependencies,Uuid,Guid,Cryptojs,Rollup,编辑:添加插件配置以更清晰 我正在汇总项目中使用uuid包。起初,我收到一条关于外部依赖加密的警告。因此,我在汇总配置中添加了external和output.globals: 导出默认值[{ 输入:'/path/to/input.js', 外部:[“加密”], 输出:{ 文件:'/path/to/output.esm.js', 格式:“esm”, ... 全球:{ 加密:“加密” } }, 插件:[ 决心({ 自定义解决方案选项:{ moduleDirectory:“节点\模块” }, 首选内

编辑:添加插件配置以更清晰


我正在汇总项目中使用
uuid
包。起初,我收到一条关于外部依赖加密的警告。因此,我在汇总配置中添加了
external
output.globals

导出默认值[{
输入:'/path/to/input.js',
外部:[“加密”],
输出:{
文件:'/path/to/output.esm.js',
格式:“esm”,
...
全球:{
加密:“加密”
}
},
插件:[
决心({
自定义解决方案选项:{
moduleDirectory:“节点\模块”
},
首选内置:正确
}),
普通的({
namedExports:{
uuid:['v4']
}
})
]
}];
警告已消失,但现在我的输出文件中有一条import语句:

output.esm.js

从“crypto”导入加密;
...
我的问题是,如果我在浏览器中包含
output.esm.js
,这是否有效


起初,我收到了一个关于外部依赖加密的警告

这是因为Rollup不知道是要使用节点的内置
加密还是外部包
@rollup/plugin node resolve
首选内置项
用于在这些备选方案中进行选择

因此,我在汇总配置中添加了external和output.globals

这些选项与
preferBuiltins:true
一起告诉Rollup使用节点的内置
crypto
,而不捆绑它(因此输出文件中仍然存在import语句)

但是,如果您的目标环境是浏览器,则应使用依赖Web Crypto API的
uuid
提供的,而不是节点的
Crypto
。为此,以下汇总配置应足够:

//rollup.config.js
导出默认值[{
输入:。。。,
输出:{
文件:。。。,
格式:“esm”,
},
插件:[
决心({
browser:true,//这指示插件使用
//package.json中的“browser”属性
}),
commonjs(),
],
}];

只是出于好奇:

我的问题是,如果我在浏览器中包含output.esm.js,这是否有效


不,不会的;主要是因为浏览器不理解裸模块说明符(
从'crypto'
而不是
'./path/to/crypto.js'
导入加密)。此外,根据您的汇总配置,
crypto
被视为内置的nodejs,它在浏览器中不可用,除非捆绑:)

您使用的是
@Rollup/plugin node resolve
?如果是,你能显示它的配置吗?@Umbo我已经更新了我的问题,包括插件节点解析配置还有一个问题。加密模块与它的浏览器计数器部件有很大的不同。我查看了uuid的源代码,发现依赖于名为
getRandomBytes
的方法,该方法在节点API中可用,但在浏览器中缺失。这是否确保这些是多填充的?或者我完全理解错了,选项
browser:true
将绑定节点的加密库作为输出的一部分。如果您理解正确,则不会绑定。原则上,除非您想直接使用加密,否则您不应该担心polyfills:
uuid
的自述文件会提到这一点。另外,我要说的是,
getRandomBytes
不会在任何地方被调用,这是一个非常好的迹象。确认了在浏览器中使用uuid时,nodeResolve({browser:true})是有效的。为了便于搜索,在没有“browser:true”的情况下出现的错误有:1)在汇总中:“(!)未解析的依赖项加密(由node_modules/uuid/dist/esm node/rng.js导入,node_modules/uuid/dist/esm node/sha1.js导入),以及2)在Chrome中:“未解析类型错误:无法解析模块说明符”加密。相对引用必须以“/”、“/”或“./”开头