javascript - Angular8 ile bir Web Worker olarak NPM paketi Stockfish.js (satranç motoru) derlenirken hata
Hedef, tarayıcıda bir satranç motoruna karşı çalışabilecek ve oynayabilecek bir Angular uygulamasıdır. Stockfish.js'i bir Web Worker olarak çalıştırmak istiyorum. Worker() yapıcısını stockfish.js dosyasına işaret eden URI ile çağırdığımda, Angular 'Module build failed' hatası ile derlemeyi başaramıyor.
Bu, tarayıcıda satranç motorunu test etmeye yeni başladığım yepyeni bir Angular uygulaması. Çalıştırıyorum...
Angular CLI: 8.0.3 Node: 10.16.0 OS: darwin x64 Angular: 8.0.2 Satranç motoru: Stockfish.js 10.0 NPM'den
Bir mantık kontrolü olarak, stockfish.js'i bir Web Worker olarak çalıştıran basit bir HTML ve JS dosyası servis ettim ve sorunsuz çalıştı. Typescript ve Angular olmadan aynı kod.
Angular projelerinde böyle büyük bir üçüncü taraf NPM paketini Web Worker olarak kullanan insanlarla ilgili herhangi bir örnek veya problem bulamadım.
Angular derleyicisinin hoşlanmadığı stockfish.wasm dosyasıyla stockfish.js dosyasının ne yapmaya çalıştığı konusunda bir şeyleri kaçırıyor gibi hissediyorum.
Bu kodu Angular dokümanlarından, Web Worker bölümüden aldım. Ve Worker() yapıcısına stockfish yolunu geçiriyorum.
app/app.component.ts
const worker = new Worker ('../../node_modules/stockfish/src/stockfish.js', { type: 'module' });
worker.onmessage = ({ data }) => {
console.log(`page got message: ${data}`);
};
worker.postMessage('isready');
Bu, Angular CLI'nin oluşturduğu yapılandırma dosyasıdır
tsconfig.worker.json
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./out-tsc/worker",
"lib": [
"es2018",
"webworker"
],
"types": []
},
"include": [
"src/**/*.worker.ts"
]
}
Stockfish dosya yapısı
node_modules
- stockfish
-src
license.js
stockfish.asm.js
stockfish.js
stockfish.wasm
Angular derlendiğinde aldığım hata bu...
Module build failed (from ./node_modules/worker-plugin/dist/loader.js):
ModuleNotFoundError: Module not found: Error: Can't resolve 'fs' in '/Users/nicksugar/Chess/node_modules/stockfish/src'
at factory.create (/Users/nicksugar/Chess/node_modules/webpack/lib/Compilation.js:823:10)
at factory (/Users/nicksugar/Chess/node_modules/webpack/lib/NormalModuleFactory.js:397:22)
at resolver (/Users/nicksugar/Chess/node_modules/webpack/lib/NormalModuleFactory.js:130:21)
at asyncLib.parallel (/Users/nicksugar/Chess/node_modules/webpack/lib/NormalModuleFactory.js:224:22)
at /Users/nicksugar/Chess/node_modules/neo-async/async.js:2830:7
at /Users/nicksugar/Chess/node_modules/neo-async/async.js:6877:13
at normalResolver.resolve (/Users/nicksugar/Chess/node_modules/webpack/lib/NormalModuleFactory.js:214:25)
at doResolve (/Users/nicksugar/Chess/node_modules/enhanced-resolve/lib/Resolver.js:184:12)
at hook.callAsync (/Users/nicksugar/Chess/node_modules/enhanced-resolve/lib/Resolver.js:238:5)
at _fn0 (eval at create (/Users/nicksugar/Chess/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:15:1)
at resolver.doResolve (/Users/nicksugar/Chess/node_modules/enhanced-resolve/lib/UnsafeCachePlugin.js:37:5)
at hook.callAsync (/Users/nicksugar/Chess/node_modules/enhanced-resolve/lib/Resolver.js:238:5)
at _fn0 (eval at create (/Users/nicksugar/Chess/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:15:1)
at hook.callAsync (/Users/nicksugar/Chess/node_modules/enhanced-resolve/lib/Resolver.js:238:5)
at _fn0 (eval at create (/Users/nicksugar/Chess/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:27:1)
at resolver.doResolve (/Users/nicksugar/Chess/node_modules/enhanced-resolve/lib/DescriptionFilePlugin.js:42:38)```
Cevap #1
Özel Angular oluşturucusunu yüklemeyi deneyin ve webpack ile fs öğesini devre dışı bırakın
çalıştır npm i -D @angular-builders/custom-webpack
angular.json dosyanızı, sanal yapılandırmayı webpack.config.js dosyanız ile genişletmek için custom-webpack modülünü kullanmasını söyleyecek şekilde düzenleyin. Özel webpack.config.js dosyanızı oluşturun:
module.exports = {
node: {
fs: 'empty'
}
};
Daha fazla detay için bu bağlantıya bakın
