[英]Hot reloading with typescript and node
有很多文章解释了如何连接nodemon
或ts-node-dev
以在文件更改时自动重启你的 TypeScript 服务器,但是在我的大型 TypeScript 项目中重启整个服务器开始变得很慢,在那里启动时间可以需要几十秒(感谢typeorm
)。
前端开发一直由像create-react-app
、 nextjs
等样板文件主导,这些样板提供热重载甚至页面刷新,从而导致前端更改的反馈时间非常快。
在 Node API 上这样做的等价物是什么,尤其是源文件在 TypeScript 而不是 JS 中的那个? 我应该使用tsc --watch
然后在编译输出完成时使require.cache
无效吗?
我们用
/* eslint-env node */
import path from 'path';
import {
disposeOnReload,
enableHotReload,
getReloadCount,
hotClass,
hotRequire,
hotRequireExportedFn,
registerUpdateReconciler
} from '@hediet/node-reload';
import { IStart, Logger } from './interfaces';
import { initNextJs } from './modules/application/initNextJs';
import { Globals } from './global';
const index = path.join(__dirname, '../client/index.html');
enableHotReload({ entryModule: module, loggingEnabled: false });
registerUpdateReconciler(module);
Logger.log('[ADMIN] Globals.init()');
Globals.init();
@hotClass(module)
class Loader {
private v1 = 1; // for reload
static start(info: IStart) {
return new Promise<void>((done) =>
hotRequire<typeof import('./server')>(module, './server', (server) => {
Logger.log('[ADMIN] server.start()');
server
.start(info)
.then(() => {
done();
})
.catch((error) => {
Logger.error('[ADMIN] Error starting!', { error });
process.exit(1);
});
return {
dispose: () => {
Logger.log('[ADMIN] server.stop()');
server.stop();
}
};
})
);
}
}
let startInfo: IStart;
hotRequireExportedFn(module, Loader, { hasFnChanged: 'useSource' }, (loader) => {
const reloadCount = getReloadCount(module);
if (reloadCount === 0) {
Logger.log('[ADMIN] initNextJs');
const nextApp = initNextJs(true);
console.time('************************************************** Prepared Next');
const preparing = nextApp.prepare().then(() => {
console.timeEnd('************************************************** Prepared Next');
});
startInfo = { nextApp, index, preparing };
}
setTimeout(() => loader.start(startInfo), 0);
return { dispose: () => console.log('loader.dispose()') };
});```
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.