成人免费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

2013-11-01 09:34:56

Node.js技術

2015-03-10 10:59:18

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-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

2011-11-10 08:55:00

Node.js

2012-10-24 14:56:30

IBMdw

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

2019-07-09 14:50:15

Node.js前端工具

2015-06-23 15:27:53

HproseNode.js

2020-10-26 08:34:13

Node.jsCORS前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费观看av| 亚洲一区精品在线 | 亚洲国产精品久久久 | 亚洲视频二区 | 91视频91| 久久久高清 | 欧美日韩综合 | 久久99精品国产自在现线小黄鸭 | 色偷偷噜噜噜亚洲男人 | 毛片在线视频 | 国产丝袜一区二区三区免费视频 | 精品国产18久久久久久二百 | 欧美激情五月 | 在线欧美一区 | 爽爽免费视频 | 日日夜夜操天天干 | 国产精品久久久久久久7电影 | 超碰人人艹 | 免费av手机在线观看 | 中文字幕一区二区三区精彩视频 | 一区二区三区中文 | 毛片免费观看视频 | 久久国产综合 | 97热在线 | 精品国产91乱码一区二区三区 | 亚洲福利一区 | 国产真实乱对白精彩久久小说 | 亚洲一区二区不卡在线观看 | 国产一区不卡 | 久久com | 中文字幕av在线 | 午夜影晥 | 成人国产精品久久久 | 久久久人成影片一区二区三区 | 日本成人三级电影 | 午夜成人免费视频 | 亚洲精品久久久久中文字幕欢迎你 | 成人免费观看男女羞羞视频 | 国产成人小视频 | 亚洲欧美激情精品一区二区 | 日本精品一区二区三区视频 |