【问题标题】:Hot reloading with typescript and node使用 typescript 和 node 热重载
【发布时间】:2021-02-01 23:48:45
【问题描述】:

那里有很多文章解释了如何连接 nodemonts-node-dev 以在文件更改时自动重新启动您的 TypeScript 服务器,但是在我的大型 TypeScript 项目中重新启动整个服务器开始变得相当缓慢,其中启动时间可能需要几十秒(感谢typeorm)。

前端开发一直被 create-react-appnextjs 等样板所主导,这些样板甚至无需刷新页面即可提供热重新加载,从而导致前端更改的反馈时间非常快。

在 Node API 上执行此操作的等价物是什么,尤其是在源文件位于 TypeScript 而不是 JS 的情况下?我应该使用tsc --watch,然后在编译输出完成时使require.cache 失效还是什么?

【问题讨论】:

  • 检查this库。
  • 你试过 tsc-w 和 nodemon 同时使用吗?
  • @MBB 我特意询问如何在文件更改时不重新加载整个节点服务器,请参阅我的问题。
  • @Eldar 我试试看,谢谢!

标签: node.js typescript hot-reload


【解决方案1】:

我们使用

/* 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()') };
});```

【讨论】:

    猜你喜欢
    • 2020-12-18
    • 2016-05-13
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2019-04-26
    • 2020-05-26
    相关资源
    最近更新 更多