Open8
Node.js でスクレイピング
HTML の取得に node-fetch
querySelector などを使うために jsdom
jsdom 使おうとするとエラーになる
Error:
Error: Build failed with 1 error:
node_modules/jsdom/lib/jsdom/utils.js:160:25: ERROR: Could not resolve "canvas"
esbuild でビルドしているからっぽい
No loader is configured for ".node" files: node_modules/canvas/build/Release/canvas.node
external に canvas を指定してエラー回避
esbuild: {
external: ['canvas']
}
別のエラーがまだ出ている
▲ [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;
╵
これを参考に
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',
}
でエラー回避できた