首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深聊Nodejs模块化

Nodejs 中引入模块会经过以下三个步骤:路径分析文件定位编译执行在了解具体的内容之前我们先了解两个概念:核心模块:Nodejs 提供的内置模块,比如 fs、url、http 等文件模块:用户自己编写的模块...,比如 Koa、Express 等核心模块在 Nodejs 源代码的编译过程中已经编译进了二进制文件Nodejs 启动时会被直接加载到内存中,所以在我们引入这些模块的时候就省去了文件定位、编译执行这两个步骤...2.2.2 路径形式的文件模块标识符为路径字符串,require 都会把它当做文件模块来加载,在根据标识符获得真实路径之后,Nodejs 会将真实路径作为键把模块缓存到一个对象里,使二次加载更快。...可以看到文件路径越深的时候查找所耗时间越长,所以这也是自定义模块加载速度最慢的原因。在 Windows 环境中,Nodejs 通过下面函数获取模块路径:Module....这是使用 C/C++ 编写的扩展模块,通过内置的 dlopen 方法加载最后编译生成的文件.mjs 文件:这是 Nodejs 支持 ESM 加载方式的模块文件,所以使用 require 方法载入的时候会直接抛出错误

1.6K21

从发布订阅模式入手读懂Node.js的EventEmitter源码

消息中心:负责存储消息与订阅者的对应关系,有消息触发,负责通知订阅者 订阅者:去消息中心订阅自己感兴趣的消息 发布者:满足条件,通过消息中心发布消息 有了这种模式,前面处理几个相互依赖的异步API就不用陷入...我们挑几个API看一下: 构造函数 代码传送门: github.com/nodejs/node… ? 构造函数很简单,就一行代码,主要逻辑都在EventEmitter.init里面: ?...这里需要注意一点,如果一个类型的事件只有一个订阅,this._events就直接是那个函数了,而不是一个数组,在源码里面我们会多次看到对这个进行判断,这样写是为了提高性能。...这两个方法都是调用了_addListener,这个方法对参数进行了判断和错误处理,核心代码仍然是往this._events里面添加事件: ?...如果不是错误类型的事件,就把订阅的回调事件拿出来执行: image.png 取消订阅 代码传送门:github.com/nodejs/node… EventEmitter里面取消订阅的API是removeListener

88831
您找到你想要的搜索结果了吗?
是的
没有找到

Module.exports和exports的区别

为了实现这个,需要将期望导出的对象赋值给module.exports。 注意,将期望的对象赋值给exports会简单地重新绑定到本地exports变量上,这可能不是你想要的。...()); // module.exports的函数 // 函数在module.exports没有定义,属性在module.exports有定义 console.log(a.id); // module.exports...例三 4.js、5.js module.exports的对象、prototype、构造函数使用 // 4.js var a = require('./5.js'); // 若传的是类,new一个对象...var person = new a('Kylin',20); console.log(person.speak()); // my name is Kylin ,my age is 20 // 若不需要构造函数初始化参数...文章有很多地方描述的可能不是很准确,提到的点也不够全面,如果有不对的地方,还望斧正!

1.2K00

Nodejs Serialport文档翻译

所以当你试图运行serialport,如果你得到非法指令,你将需要重新构建serialport二进制文件通过告知npm去重新构建它。...如果你node二进制文件nodejs不是node或者如果你的nodejs版本是v0.10.29 ,那么你应该根据以下这个说明来操作。...如果那儿有一个你不需要的你平台的二进制文件,请继续!...autoOpen选项没有失效的时候,构造函数的 openCallback 被传递给.open()。如果你已经将它关闭,callback回调会被忽视。 .open()函数需要一个在串口打开后的回调。...参数错误抛出一个TypeError对象。这些函数被叫做无效参数,你将会看见这些。 如果没有回调被提供,运行时错误提供Error对象给函数回调或者发出一个error event。

2.6K30

nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick

,或者达到了该阶段允许运行函数的数量的最大值,满足任何一个条件,事件循环都会进入下一个阶段,以此类推。...poll阶段 poll阶段有两个主要的功能: 计算需要阻塞的时长,以便可以将完成的I/O添加进待执行队列 执行poll队列中产生的事件 当事件循环进入poll阶段且此时并没有待执行的timer,会按照下述逻辑来判断...然而,如果一个回调函数被setImmediate( )添加poll阶段处于空闲状态,它就会结束并进入check阶段而不是继续等待poll事件。...有时也需要在调用栈并不为空去执行一些回调函数。...所以,在构造函数内部你需要使用process.nextTick( )来设置事件发送的语句,才可以保证事件触发,监听器已经被注册,示例如下: const EventEmitter = require('

1.2K30

说说JS中的沙箱

,仍然会沿着作用于链查找,为了绕开作用域链的查找,笔者通过访问箭头函数的constructor的方式拿到了构造函数Function,这个时候,Funtion内所执行的xss代码,在执行的时候,便不会再沿着作用域链往上找...假如传入的代码不是按照的规定的数据格式(例如json),就直接抛出错误,阻止恶意代码注入,但这始终不是一种安全的做法。...2)当你使用postMessageAPI的时候,由于sandbox的origin默认为null,需要设置allow-same-origin允许两个页面进行通信,意味着子页面内可以发起请求,这时候你需要防范好...3、nodejs中的沙箱 nodejs中使用沙箱很简单,只需要利用原生的vm模块,便可以快速创建沙箱,同时指定上下文。...通过runInNewContext返回沙箱中的构造函数Function,同时传入切断原型链的空对象防止逃逸,之后再外部使用的时候,只需要调用返回的这个函数,和普通的new Function一样调用即可。

2.5K30

这里有一份Node.js入门指南和实践,请注意查收

如果你需要将模块导出为一个函数(如:构造函数),或者想导出一个完整的出口对象而不是做为属性导出,这时应该使用 module.exports。...访问主模块 Node.js 直接运行一个文件,require.main 属性会被设置为 module 本身。...由于调用的位置不同,可能会解析到不同的文件(如,需要从 node_modules 文件夹加载的情况)。所以,解析到其它文件,就不能保证 require('index')总是会返回确切的同一对象。.../INDEX')会返回两个不同的对象,无论'./index'和'./INDEX'是否是同一个文件。 5. 循环依赖 require()存在循环调用时,模块在返回可能并不会被执行。...,使用回调其不能正常执行。

3.6K30

贝壳前端面经

三面下来总共耗时两个小时。 ...浏览器请求一个资源的过程  页面渲染的过程  代码层面和网络请求层面的性能优化  了解过哪些es6的新特性  promise的特点  用es5实现一个promise(我说的是用jquery的defered)  原型  一个构造函数的原型上有一个基本类型的属性...a,new 两个实例b和c,改变b.a , c.a是否会跟着变?...  浏览器插件做的什么,怎么做的  二面:  React的特点,应用场景  React和vue的区别  webpack的作用  webpack用到了哪些loader和插件  是不是把所有文件都打包成一个文件一定就好...  webpackcss-loader和style-loader冲突怎么解决  nodejs的特点  nodejs如何搭建一个websocket服务器  当在一个for循环里alert(i)为了解决

1.1K10

javascript基础修炼(3)—Whats this(下)

这样限制的好处是在使用构造函数而忘记写new操作符时会报错,而不会把本来需要绑定在实例上的一堆属性全绑在window对象上,在许多没有正确地绑定this的场景中也会报错。 二....2.2 对象属性的嵌套 调用的函数在对象结构上的定义具有一定深度,this指向这个方法所在的对象,而不是最外层的对象。...全局对象global Nodejs的运行环境并不是浏览器,所以程序里没有DOM和BOM对象,Nodejs中也存在全局作用域,用来定义一些不需要通过任何模块的加载即可使用的变量、函数或类,全局对象中多为一些系统级的信息或方法...文件级this指向 Nodejs是支持模块作用域的,每一个文件都是一个模块,可通过require( )的方式同步引入,通过module.exports来暴露接口供其他模块调用。...另一个存在的限制,是没有绑定this的响应函数在异步运行时可能会出问题,它作为回调函数被传入一个异步执行的方法,同样会因为丢失了this的指向而引发错误

87720

day043: nodejs中的异步、非阻塞IO是如何实现的?

在听到 nodejs 相关的特性,经常会对 异步I/O、非阻塞I/O有所耳闻,听起来好像是差不多的意思,但其实是两码事,下面我们就以原理的角度来剖析一下对 nodejs 来说,这两种技术底层是如何实现的...阻塞和非阻塞I/O 阻塞和非阻塞 I/O 其实是针对操作系统内核而言的,而不是 nodejs 本身。...为了让 nodejs 知道操作系统已经做完 I/O 操作,需要重复地去操作系统那里判断一下是否完成,这种重复判断的方式就是轮询。...遍历文件描述符(即 文件I/O 操作系统和 nodejs 之间的文件凭证)的方式来确定 I/O 是否完成,I/O完成则文件描述符的状态改变。但 CPU 轮询消耗还是很大。 epoll模式。...nodejs中的异步 I/O 采用多线程的方式,由 EventLoop、I/O 观察者,请求对象、线程池四大要素相互配合,共同实现。

2.4K30

myweb框架简单说明

本框架路由经历了两个过程: a、 直接通过key值来判断用户请求的资源,例如: http://127.0.0.1:3000/index,这个请求我们利用express获取key值index,然后读取配置文件信息...当我们有300个action(很正常),我们需要写入300条记录到一个配置文件中,这样会导致配置文件越来越繁重。...其中的日志设定:错误、警告、流水记录,同时可以设定日志错误级别,以便系统出错即时的定位。 5、 邮件发送功能 这个功能没有做进一步的封装,只是利用了他人的库进行配置,之后会做进一步封装。...这里我只介绍如何new一个controller同时,访问对象的一个action的方式 Nodejs不像PHP有一个call_function函数可以执行访问对象中的某个方法名函数。...: 1、 我们可以定义一个init构造函数 controllerObj.init(req, res) 2、 利用JavaScript中的eval 例如: var controllerObj = eval

61330

七天学会NodeJS——第一天

可以看到,N大于1,问题简化为计算N乘以N-1的阶乘。N等于1,问题达到最小规模,不需要再简化,因此直接返回1。...例如我们把几个JS文件合并成一个文件后,如果文件中间含有BOM字符,就会导致浏览器JS语法错误。因此,使用NodeJS读取文本文件,一般需要去掉BOM。...但是全局客户端默认只允许5个并发Socket连接,某一个时刻HTTP客户端请求创建过多,超过这个数字,就会发生socket hang up错误。...入口函数完整描述了程序的运行逻辑,其中解析URL和合并文件的具体实现封装在其它两个函数里。 解析URL先将普通URL转换为了文件合并URL,使得两种URL的处理方式可以一致。...这会导致以下两个问题: 请求的文件比较多比较大,串行读取文件会比较耗时,从而拉长了服务端响应等待时间。

6.9K20
领券