关于NodeJS中的循环引用详解


Posted in NodeJs onJuly 23, 2019

最近在用node的时候排查一个问题排查了半天,最终发现是循环引用导致的问题,故在此记录一下。

场景复现

出现问题场景比较简单,一共四个类:

  • parent.ts
  • child.ts
  • child_2.ts
  • util.ts
export abstract class Parent {

 abstract hello(): string;
}
import {Parent} from "./parent";

export class Child extends Parent {

 hello(): string {
  return "child";
 }

}
import {Child} from "./child";

export class Util {

 static useChildInSameCase(): string {
  let child: Child;
  return child.hello();
 }
}
import {Parent} from "./parent";

export class Child_2 extends Parent {

 hello(): string {
  return "child_2";
 }

}

这个时候我们去构造一个Child类:

import {Child} from "./child";

console.log(new Child().func());

就会直接报错了:

class Child_2 extends parent_1.Parent {
^

TypeError: Class extends value undefined is not a function or null

#寻找原因

说的是这个父类是一个undefined,很明显就是没有初始化。

一开始我觉得很奇怪,明明在child_2这个文件里已经import了parent,为什么会是undefined呢?后来debug查了一下代码的堆栈,恍然大悟:

入口文件->child.ts->parent.ts->util.ts->child_2.ts->parent.ts

很明显这里存在着一个循环引用,当我们在加载child_2.ts这个文件的时候,parent.ts还处在未加载完的状态。

我们可以去 官网看一下node中是如何处理循环引用的 。

通过官网我们可以知道,对于这样的循环引用,在child_2.ts加载parent.ts的时候,会去缓存中寻找,而由于parent.ts还未加载完成,所以缓存中会是一个空对象了,官网中用的语句是 an unfinished copy of the a.js 。

解决方案

知道原因之后,解决方案也就变得清晰了起来,一句话搞定,将parent.ts中的import语句放在后面:

export abstract class Parent {

  abstract hello(): string;

  func(): string {
    return Util.useChildInSameCase();
  }
}

import {Util} from "./util";

这样在加载parent.ts的时候,就会先export对象,然后再import所需要的util.ts了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

NodeJs 相关文章推荐
Nodejs极简入门教程(一):模块机制
Oct 25 NodeJs
Nodejs实现的一个静态服务器实例
Dec 06 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
nodejs如何获取时间戳与时间差
Aug 03 NodeJs
NodeJS仿WebApi路由示例
Feb 28 NodeJs
nodejs入门教程一:概念与用法简介
Apr 24 NodeJs
Nodejs之http的表单提交
Jul 07 NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
Sep 22 NodeJs
Nodejs异步回调之异常处理实例分析
Jun 22 NodeJs
NVM安装nodejs的方法实用步骤
Jan 16 NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 NodeJs
NodeJS配置CORS实现过程详解
Dec 02 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 #NodeJs
nodejs 递归拷贝、读取目录下所有文件和目录
Jul 18 #NodeJs
nodejs二进制与Buffer的介绍与使用
Jul 11 #NodeJs
nodejs中各种加密算法的实现详解
Jul 11 #NodeJs
监控Nodejs的性能实例代码
Jul 02 #NodeJs
搭建一个nodejs脚手架的方法步骤
Jun 28 #NodeJs
独立部署小程序基于nodejs的服务器过程详解
Jun 24 #NodeJs
You might like
PHP分页函数代码(简单实用型)
2010/12/02 PHP
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
PHP模板引擎Smarty自定义变量调解器用法
2016/04/11 PHP
PHP 将dataurl转成图片image方法总结
2016/10/14 PHP
php微信开发之谷歌测距
2018/06/14 PHP
javascript中常用编程知识
2013/04/08 Javascript
全面兼容的javascript时间格式化函数(比较实用)
2014/05/14 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
vue中父子组件注意事项,传值及slot应用技巧
2018/05/09 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
Vue实现日历小插件
2019/06/26 Javascript
mpvue微信小程序开发之实现一个弹幕评论
2019/11/24 Javascript
Python 连连看连接算法
2008/11/22 Python
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
介绍Python中几个常用的类方法
2015/04/08 Python
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
Django中reverse反转并且传递参数的方法
2019/08/06 Python
Python持续监听文件变化代码实例
2020/07/22 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
英国门把手公司:Door Handle Company
2019/05/12 全球购物
英国领先的新鲜松露和最好的松露产品供应商:TruffleHunter
2019/08/26 全球购物
机关门卫制度
2014/02/01 职场文书
2014年母亲节寄语
2014/05/07 职场文书
运动会100米加油稿
2015/07/21 职场文书