微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用打字稿和节点热重载

如何解决使用打字稿和节点热重载

那里有很多文章说明如何挂接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()') };
});```

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。