Open8

Node.js でスクレイピング

Wataru TaguchiWataru Taguchi

jsdom 使おうとするとエラーになる

Error:
Error: Build failed with 1 error:
node_modules/jsdom/lib/jsdom/utils.js:160:25: ERROR: Could not resolve "canvas"
Wataru TaguchiWataru Taguchi
No loader is configured for ".node" files: node_modules/canvas/build/Release/canvas.node
Wataru TaguchiWataru Taguchi

別のエラーがまだ出ている

[WARNING] "./xhr-sync-worker.js" should be marked as external for use with "require.resolve"

    node_modules/jsdom/lib/jsdom/living/xhr/XMLHttpRequest-impl.js:31:57:
      31 │ const syncWorkerFile = require.resolve ? require.resolve("./xhr-sync-worker.js") : null;
Wataru TaguchiWataru Taguchi

https://githubmemory.com/repo/evanw/esbuild/issues/1311

これを参考に

plugins/jsdomPatch.js

const fs = require('fs');

const jsdomPatch = {
  name: 'jsdom-patch',
  setup(build) {
    build.onLoad({ filter: /jsdom\/living\/xhr\/XMLHttpRequest-impl\.js$/ }, async args => {
      let contents = await fs.promises.readFile(args.path, 'utf8');

      contents = contents.replace(
        'const syncWorkerFile = require.resolve ? require.resolve("./xhr-sync-worker.js") : null;',
        `const syncWorkerFile = "${require.resolve('jsdom/lib/jsdom/living/xhr/xhr-sync-worker.js')}";`,
      );

      return { contents, loader: 'js' };
    });
  },
};

module.exports = [jsdomPatch];
esbuild: {
      plugins: './plugins/jsdomPatch.js',
}

でエラー回避できた