今晚接到个面试电话,被问到 node中 require函数的加载过程?一两年前有研究过这部分,真的忘记了。刚刚重新调试查看了下这部分的源码,简单总结下大概的过程。
1.会默认调用require函数,其实是Module.prototype.require方法
2.Module._load 调用模块加载方法,最终返回的是module.exports
3.Module._resolveFilename 解析文件名参数,转换为绝对路径后按优先级默认尝试添加 .js .json .node
4.Module._cache 判断是否存在缓存,如果有缓存,那么就直接返回上次require的结果
5.如果没有缓存,那么就通过new Module 来创建模块(对象),主要的实例成员为id 和 exports
6.对新创建的模块进行缓存处理
7.尝试加载模块(Module.prototype.load)
8.Module._extensions 获取当前模块的扩展名并根据扩展名调用对应的方法
9.通过fs.readFileSync获取具体的内容
10.module._compile
11.将具体的内容包裹到函数中 (function (exports, require, module, __filename, __dirname) {})
12.执行函数fn.call(exports, exports, require, module, __filename, __dirname)
13.最终返回 module.exports;

前端开发系列119-进阶篇之commonJS规范和require函数加载的过程的更多相关文章

  1. openlayers5-webpack 入门开发系列一初探篇(附源码下载)

    前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...

  2. leaflet-webpack 入门开发系列一初探篇(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  3. 【Windows10 IoT开发系列】配置篇

    原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...

  4. ESP8266开发之旅 进阶篇② 闲聊Arduino IDE For ESP8266烧录配置

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  5. 【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps

    [Silverlight]Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps 上个月微软必应地图(Bing Maps) ...

  6. Javascript模块化编程之CommonJS,AMD,CMD,UMD模块加载规范详解

    JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发?     模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问 题进行系 ...

  7. 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)

    转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/49992269 本文出自:[江清清的博客] (一).前言: [好消息] ...

  8. Flutter 开发从 0 到 1(四)ListView 下拉加载和加载更多

    在<APP 开发从 0 到 1(三)布局与 ListView>我们完成了 ListView,这篇文章将做 ListView 下拉加载和加载更多. ListView 下拉加载 Flutter ...

  9. webpack4 系列教程(四): 单页面解决方案--代码分割和懒加载

    本节课讲解webpack4打包单页应用过程中的代码分割和代码懒加载.不同于多页面应用的提取公共代码,单页面的代码分割和懒加载不是通过webpack配置来实现的,而是通过webpack的写法和内置函数实 ...

  10. react开发中如何使用require.ensure加载es6风格的组件

    其实用的babel,在浏览器端就应该可以加载,之前少了个default: require.ensure([],(require) => { let A = require('./a.js').d ...

随机推荐

  1. 如何在 Go 中解析 yaml 文件

    Go 语言没有内置解析 yaml 文件的功能,实现 yaml 的解析可以使用第三方库 gopkg.in/yaml.v2 和 gopkg.in/yaml.v3. 下面以解析 config.yml 文件为 ...

  2. Asp.net core 少走弯路系列教程(二)HTML 学习

    前言 新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力. 新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马. 作者认 ...

  3. 异步IO与Tortoise-ORM的数据库

    title: 异步IO与Tortoise-ORM的数据库 date: 2025/04/29 13:21:47 updated: 2025/04/29 13:21:47 author: cmdragon ...

  4. 一个日h站的Nday

    0x00 前言 今天先来无事的我翻起了qq收藏夹.忽然发现了一个去年EDUSRC群里一个老表发的洞.今天就给大家发出来耍耍. 抵制黄色网站人人有责,打造绿色上网环境. 面对正规网站时候,请不要做非法测 ...

  5. 时间工具类之“LocalDateTime方案转换地域性时差问题->UTC时间转纽约时间”

    一.使用方法 1.获取纽约ZoneId[纽约时区的ZoneId标识为"America/New_York"] -> ZoneId.of("America/New_Yo ...

  6. GDI+中的Region的集合关系

    string content=""; GraphicsPath c1 = new GraphicsPath(); c1.AddEllipse(0, 20, 50, 50); Gra ...

  7. #React中类组件中关于回调函数的一个问题

    在ES6中,类中定义的方法,是放在原型对象的,供实例对象引用. //创建一个Person类 class Person { constructor(name,age) { this.name = nam ...

  8. Qt图像处理技术一:对QImage图片美颜,使用双指数滤波

    一.效果图 二.demo源码地址(除了磨皮还有一些基本的滤镜) 如果你觉得有用的话,期待你的小星星 实战应用项目: github :https://github.com/dependon/simple ...

  9. 使用 Certbot 申请 SSL 证书

    Certbot 可以用于从 Let's Encrypt 自动申请.安装.更新免费的 HTTPS 证书(默认只有3个月有效期,可使用脚本自动续期). 1.安装 Certbot Linux:apt ins ...

  10. MVVM-命令模式的实现与应用

    MVVM-命令模式的实现与应用 本文同时为b站WPF课程的笔记,相关示例代码 绑定 这个其实前面已经讲过一部分 使用{Binding}设置数据绑定,将控件的属性绑定到 ViewModel 的相应属性. ...