[英]Bundling pouchdb-adapter-memory with Rollup
我正在嘗試將 memory 適配器用於 PouchDB 。 我想使用Rollup捆綁我的應用程序(以及 Pouch 和此適配器等依賴項)。 為了將其減少到最小可重現的問題,想象這是我要捆綁的應用程序:
import PouchDB from 'pouchdb-browser'
import MemoryAdapterPlugin from 'pouchdb-adapter-memory'
PouchDB.plugin(MemoryAdapterPlugin)
因為我使用的是節點模塊,所以我顯然需要rollup-node-resolve
Rollup 插件。 此外,PouchDB 的許多依賴模塊都是 CJS 格式,因此我還需要rollup-node-commonjs
Rollup 插件。 最后,PouchDB 使用了一些內置的 Node 模塊(例如events
)和 memory 適配器( buffer
等)。 我不確定這些是否在運行時使用(它可能只是在 PouchDB 的代碼中,因為它可以在 Node 或瀏覽器中工作)但為了防止捆綁錯誤,我還將包括rollup-plugin-polyfill-node
插件但如果需要且可用,請指示 resolve 插件優先使用內置插件而不是瀏覽器目標。
有了所有這些,這里就是我的匯總配置:
import commonjs from '@rollup/plugin-commonjs'
import resolve from '@rollup/plugin-node-resolve'
import polyfillNode from 'rollup-plugin-polyfill-node'
export default {
input: 'index.js',
output: {
format: 'iife',
name: 'app',
file: 'bundle.js'
},
plugins: [
commonjs({
requireReturnsDefault: "auto",
}),
polyfillNode(),
resolve({
preferBuiltins: true,
browser: true
}),
]
}
這將捆綁。 但是,當我在瀏覽器中加載捆綁包時,我收到有關繼承 polyfill 在此行不起作用的錯誤:
https://github.com/FredKSchott/rollup-plugin-polyfill-node/blob/main/polyfills/inherits.js#L7
它說superCtor
未定義。 如果我在回溯上后退一個級別,它來自這一行:
https://github.com/nodejs/readable-stream/blob/main/lib/_stream_duplex.js#L46
Readable
未定義。 當我捆綁時,我收到有關循環引用的警告。 我認為它從根本上圍繞着這樣一個事實,即一些 PouchDB 依賴項明確使用 NPM 包作為 polyfill(如繼承和可讀流),而 polyfillNode 插件也提供了一些相同的 polyfill,但它們以不兼容的方式提供。 但我不知道如何解開它。
終於能夠解決這個問題,所以將提供答案,以防其他人需要在 Rollup 中捆綁 PouchDB memory 適配器。
可讀流 polyfill 是一堆循環依賴。 這在 CJS 格式下沒問題,但由於 Rollup 將 CJS 轉換為 ES 格式,因此 Rollup 無法找出正確的順序來放置東西。這導致在尚未定義超類的地方使用inherits
。 可讀流 polyfill 有一個關於此的開放票證。 一般的解決方案是在 Node 的上游修復它,然后根據該上游修復剪切一個新的 polyfill 副本。 上游修復已完成,但 polyfill 尚未更新。 一旦是這應該自然解決。
與此同時,我們可以使用其他人的 polyfill 分支,解決了循環依賴。 那個問題中提到了這個叉子,但妙語是將其添加到package.json
:
"readable-stream": "npm:vite-compatible-readable-stream@^3.6.0",
這將強制可讀流解析到那個分支。 但這還不是全部。 memory 適配器的一些依賴項被鎖定到不同版本的可讀流。 為了解決這個問題,我們想將以下內容添加到匯總的解析插件中:
dedupe: ['readable-stream']
這將強制我們明確添加到項目中的可讀流替代品在需要可讀 stream 的任何時候使用。
最后一個問題是 PouchDB 使用的是舊版本的 memdown,它也存在循環依賴問題。 最新版本似乎不能與 memory 適配器配合使用。 PouchDB 有一張更新 memdown 的開放票證,當發生這種情況時,這自然會解決。
同時解決我們將遵循與上述類似的模式。 我們將明確要求 memdown 進入我們的項目,盡管不需要 fork。 只是一個較新的版本。 然后強制 memory 適配器使用此版本,我們也將memdown
添加到該dedup
選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.