簡體   English   中英

將 pouchdb-adapter-memory 與 Rollup 捆綁在一起

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM