簡體   English   中英

使用打字稿和節點熱重載

[英]Hot reloading with typescript and node

有很多文章解釋了如何連接nodemonts-node-dev以在文件更改時自動重啟你的 TypeScript 服務器,但是在我的大型 TypeScript 項目中重啟整個服務器開始變得很慢,在那里啟動時間可以需要幾十秒(感謝typeorm )。

前端開發一直由像create-react-appnextjs等樣板文件主導,這些樣板提供熱重載甚至頁面刷新,從而導致前端更改的反饋時間非常快。

在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM