成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

給大家變個 Node.js 的小魔術

開發 前端
Node.js 的 js 模塊加載的流程是 load -> _extensions['.js'] -> _compile,可以通過修改 _extensions['.js'] 來達到 hook 的目的,比如在 _compile 之前做一些代碼轉換。

[[425926]]

本文轉載自微信公眾號「神光的編程秘籍」,作者神說要有光。轉載本文請聯系神光的編程秘籍公眾號。

魔術演出

我們準備一個 Node.js 的模塊 input.js:

  1. // input.js 
  2. function func() { 
  3.     return '卡頌' 
  4. module.exports = func(); 

這個模塊返回的值是啥?

東東:是“卡頌”。

那我在另一個模塊 test.js 中引入這個 input.js,然后打印一下:

  1. // test.js 
  2. const data = require('./input.js'); 
  3. console.log(data); 

之后我在 entry.js 里面引入 test.js:

  1. require('./test.js'); 

執行之后打印的是啥?

東東:是“卡頌”。

真的么?那我們跑一下:

打印的是啥:

東東:是 “卡帥”,哇,好神奇,怎么做到的。

我:想不想學?

東東:想。

我:那接下來就進入魔術揭秘時間。

魔術揭秘

Node.js 加載模塊的流程是這樣的:

模塊加載會調用 load 方法, load 會調用對應后綴名的 _extensions 的方法來處理,其中會調用 _compile 來編譯并把結果放入 cache,之后返回。

所以呢?我們想改變 js 模塊的返回值,只需要改造下 Module._extensions['.js'] 就可以了。

  1. const Module = require('module'); 
  2. const fs = require('fs'); 
  3.  
  4. Module._extensions['.js'] = function (module, filename) { 
  5.     let content = fs.readFileSync(filename, 'utf8'); 
  6.     if (filename.includes('input')) { 
  7.         content = content.replace('卡頌''卡帥'); 
  8.     } 
  9.     module._compile(content, filename); 
  10. }; 

我們對 filename 為 input 的文件,讀取內容之后進行了替換,之后再調用 module._compile 來編譯,后續流程不變。

模塊引入方式不變,但是模塊內容已經悄悄的被修改了,這個魔術的名字叫做 require hook。

東東:原來是你藏了一段代碼沒展示。

我:魔術都是這樣的啊。而且你別小看了這個 require hook,它能做到很多強大的功能呢。

東東:哦?比如說

我:比如說 ts-node,它是怎么做到直接 require ts 模塊的?就是通過 require hook 偷偷做了編譯,其實你執行的是編譯后的 js。

比如說 babel-register 它是怎么做到直接執行帶有 esnext 新特性的代碼的?也是通過 require hook 偷偷做了編譯。

還有覆蓋率測試,其實是通過函數插樁做到的,也就是你每執行一條語句都會計數。怎么插樁呢?跑單測的時候也沒手動插樁啊,就是因為工具內部偷偷通過 require hook 做了插樁,才能得到覆蓋率數據。

東東:這個魔術還挺有用的嘛。學會了~

總結

Node.js 的 js 模塊加載的流程是 load -> _extensions['.js'] -> _compile,可以通過修改 _extensions['.js'] 來達到 hook 的目的,比如在 _compile 之前做一些代碼轉換。

這種 hook 在 babel-register、ts-node 還有單測的覆蓋率測試中都有應用,能夠達到透明的修改代碼的目的。

因為開發者不知道代碼什么時候被修改的,所以看起來比較神奇。

 

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2025-05-26 00:31:31

2022-03-30 08:36:32

Node.jsPRHTTP

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2013-11-01 09:34:56

Node.js技術

2021-12-25 22:29:57

Node.js 微任務處理事件循環

2012-02-03 09:25:39

Node.js

2020-05-29 15:33:28

Node.js框架JavaScript

2011-11-10 08:55:00

Node.js

2012-10-24 14:56:30

IBMdw

2011-09-08 13:46:14

node.js

2011-11-01 10:30:36

Node.js

2011-09-02 14:47:48

Node

2011-09-09 14:23:13

Node.js

2021-01-04 08:09:58

Node.js磁盤接口

2021-09-26 05:06:04

Node.js模塊機制

2021-11-06 18:40:27

js底層模塊

2011-11-02 09:04:15

Node.js

2021-02-01 15:42:45

Node.jsSQL應用程序

2020-10-26 08:34:13

Node.jsCORS前端

2021-04-06 10:15:29

Node.jsHooks前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久综合精品 | 日韩一区二区三区四区五区六区 | 中文字幕人成乱码在线观看 | 最新国产精品精品视频 | 国产精品美女www爽爽爽视频 | 天天操天天摸天天爽 | 久久人人国产 | 亚洲一区有码 | 成人性生交大片免费看中文带字幕 | 欧美激情视频一区二区三区在线播放 | 久久免费精品视频 | 羞羞在线观看视频 | 综合九九| 中文字幕视频在线观看 | 中文在线一区 | 国产精品不卡一区 | 国产成人精品综合 | 免费看a| 国产 亚洲 网红 主播 | 成人性视频免费网站 | 久久久91精品国产一区二区三区 | 国产原创视频 | 亚洲 精品 综合 精品 自拍 | 国产精品久久久久久久久久妇女 | 黄色成人免费看 | 人人性人人性碰国产 | 欧美日韩精品一区 | 国产日韩欧美 | 精品久久久久一区二区国产 | 一区二区三区欧美 | 91影院在线观看 | 亚洲精品自在在线观看 | 九九av| 国产精品日韩一区二区 | 亚洲国产成人精品在线 | 五月天国产视频 | 日韩国产一区二区三区 | 麻豆一区一区三区四区 | 日韩精品无码一区二区三区 | av毛片在线播放 | 特黄特黄a级毛片免费专区 av网站免费在线观看 |