typescript - Att använda object-hash i ett Angular 8-projekt orsakar felet "Cannot read property 'crypto' of undefined"
Jag har ett Angular-CLI-projekt som använder biblioteket object-hash för att skapa hashar från objekt. Normalt skulle jag bara lägga
import * as objectHash from 'object-hash'överst i en av mina komponentfiler och sedan göra const hash=objectHash(obj) var som helst jag behövde en hash.
Jag uppgraderade precis mitt projekt till Angular 8 och plötsligt fungerar Angular-projektet serves utmärkt, men när jag kör en produktionsbuild får jag ett fel: Cannot read property 'crypto' of undefined.
Detta beror på att Angular 8 genererar differential JavaScript, vilket skapar vissa paket för nyare webbläsare som <script type="module"> och för äldre webbläsare som <script nomodule>. När ett skript har type="module" behandlas tydligen this annorlunda - så object-hash-bibliotekets referens till this bryts: https://github.com/puleos/object-hash/issues/71
Har någon någon insikt i hur jag kan lösa detta?
Potentiella lösningar jag ser är:
Att importera object-hash-biblioteket på ett annat sätt på något sätt
Att använda ett helt annat webbläsarkompatibelt objekt-hashningsbibliotek (jag har inte hittat ett ännu)
- Få Angular-CLI v8 att sluta generera differential JS och bara skriva ut gammaldags bundlar (jag har inte hittat en lösning på detta än)
- Nedgradera till Angular 7
Svar #1
Efter commit 1e0835c bör uppgradering av object-hash till v2.0.1 lösa problemet (se författarens kommentar i det rapporterade problemet)
Svar #2
Jag tycker att det enklaste sättet är att använda anpassad webpack-konfiguration som i det ärendet du nämnde, eftersom det är ett problem under byggfasen, inte i körning. Som jag kan se kommer kärnmedlemmar i Angular inte att fixa detta problem snart.
Du kommer att få alla funktioner från angular/cli-byggnaden (eftersom @angular-builders/custom-webpack är baserad på standard Angular-byggaren), men du kommer att kunna skriva dina egna webpack-regler. Enligt min åsikt är det en mycket säker ytterligare konfiguration:
module.exports = {
node: {
path: true,
crypto: true,
fs: 'empty'
}
}
och jag tror att du aldrig kommer att förstöra något med @angular-uppgraderingar. Till exempel på mitt arbetsprojekt använder vi @angular-builders/custom-webpack på ett mer aggressivt sätt: vi byter ut vissa plugins och loaders och använder våra egna. Och ibland kraschar det bara.
