Je veux activer Webpack HMR dans un NodeJS projet écrit en TypeScript .
Mais module.hot
n'est pas disponible:
@ types/webpack-env définit:
declare var module: __WebpackModuleApi.Module
Qui est en conflit avec @ types/node definition:
declare var module: NodeModule
Supprimer @ types/node , résout le problème, mais désactive process
:
process.env.NODE_ENV === 'production' // [ts] Cannot find name 'process'
@ types/webpack-env a été mis à jour depuis:
Le conflit sur module
a été résolu dans ce PR
process
a été ajouté dans this commit
Le code de la question initiale ne nécessite plus que @ types/webpack-env.
Mais importer @ types/node à côté ne sera plus en conflit.
npm install --save-dev @types/webpack-env
Et si vous avez également besoin de définitions d’environnement NodeJS:
npm install --save-dev @types/node
Comme peu de gars l'ont écrit ici, c'est le meilleur moyen:
npm i -D @types/webpack-env
Pour moi, cela fonctionne comme prévu, résoudre le problème avec la propriété hot
non reconnue.
Dans mon projet, j'utilise ces versions:
"@types/node": "^8.0.19",
"@types/webpack-env": "^1.13.0"
Je ne sais pas si la question est toujours à jour, mais pour mon problème, installer des types pour webpack m'aide.
Pourrait être aussi simple que d'ajouter la ligne suivante en haut du fichier.
///<reference types="webpack-env" />
Vous pouvez étendre la portée globale et utiliser la fusion d'interface pour rouvrir l'interface NodeModule
et ajouter la propriété hot
manquante.
import webpack = require("webpack");
declare global {
interface NodeModule {
hot: {
accept(dependencies: string[], callback: (updatedDependencies: string[]) => void): void;
accept(dependency: string, callback: () => void): void;
accept(errHandler?: (err: any) => void): void;
decline(dependencies: string[]): void;
decline(dependency: string): void;
decline(): void;
dispose(callback: (data: any) => void): void;
addDisposeHandler(callback: (data: any) => void): void;
removeDisposeHandler(callback: (data: any) => void): void;
// ...
}
}
}
Mais en réalité, cette augmentation devrait potentiellement être effectuée dans le fichier de déclaration Webpack lui-même.
Changer .hot par ['hot']
if (module.hot) {
module.hot.accept();
module.hot.dispose(() => {
Utilisation
if (module['hot']) {
module['hot'].accept();
module['hot'].dispose(() => {