Menyelam mendalam ke dalam modul VM dalam Node.js
Modul VM ialah modul teras dalam NodeJS, menyokong kaedah yang diperlukan dan mekanisme pengendalian NodeJS Kadangkala kami juga boleh menggunakan templat VM untuk melakukan beberapa perkara istimewa. Artikel ini akan memberi anda pemahaman terperinci tentang modul VM dalam Node saya harap ia akan membantu anda!
Bagaimanakah rentetan boleh ditukar menjadi JS untuk pelaksanaan?Rujukan vm mesin maya | >
Dalam artikel sebelum ini, kami menyebut masalah.
Kami memperkenalkan dua kaedah secara terperinci, iaitu fungsi eval dan
Fungsi baharu. Di sini kita perlu menekankan sekali lagi bahawa fungsi yang dicipta oleh pembina tidak membuat penutupan persekitaran semasa Ia sentiasa dicipta dalam persekitaran global, jadi mereka hanya boleh mengakses persekitaran global pada masa jalan. Pembolehubah dan pembolehubah tempatannya sendiri tidak boleh mengakses pembolehubah dalam skop di mana ia dicipta oleh pembina . Ini berbeza daripada menggunakan
Function
untuk melaksanakan kod yang mencipta fungsi. Function
eval
boleh memperoleh pembolehubah global, jadi ia mungkin masih mempunyai pencemaran berubah-ubah.
global.a = 100; // 挂在到全局对象global上 var b = 200; // this !== global new Function("console.log(a)")() // 100 new Function("console.log(b)")() // b is not defined
saya akan menerbitkan artikel untuk menerangkannya secara berasingan pada masa hadapan. Function
Function
Terdapat penyelesaian lain, yang tidak kami kembangkan secara terperinci dalam artikel lepas, dan itu ialah modul
vm
modul vm
Dalam teks di atas, saya telah menekankan satu konsep, iaitu pencemaran pembolehubah.
Ciri VM ialah ia tidak dipengaruhi oleh persekitaran Ia juga boleh dikatakan bahawa ia adalah persekitaran kotak pasir
(Mod kotak pasir menyediakan persekitaran untuk modul dijalankan. tanpa menjejaskan modul lain dan kotak pasir peribadi mereka). Kami ingin menekankan di sini bahawa kerana pembolehubah global dalam
Node.jsconst vm = require('vm') global.a = 100; // 运行在当前环境中[当前作用域] vm.runInThisContext('console.log(a)'); // 100 // 运行在新的环境中[其他作用域] vm.runInNewContext('console.log(a)'); // a is not defined
Takrifan dalam Demo adalah untuk memudahkan pemahaman. Andaikan kita mempunyai fail 1.js dalam direktori yang sama, dengan
ditakrifkan di dalamnya. Sekarang setelah kami memperkenalkan fail ini kami dapati bahawa kami tidak mentakrifkan pembolehubah a dalam fail semasa, kami hanya mengaitkan dua fail modul bersama-sama. Inilah yang saya nyatakan di atas, pembolehubah global dalam global.a = 100;
Nod dikongsi antara berbilang modul.
requrie(./1); console.log(a); // 100
Sebabnya ialah dalam persekitaran Nod, terdapat konteks pelaksanaan secara global.
Jadi, boleh mengakses pembolehubah global pada
, tetapi tidak boleh mengakses pembolehubah tersuai. Walau bagaimanapun,// 模拟一下Node的全局环境 // vm.runInThisContext在当前全局环境执行,但不会产生新函数 - function(exports, module, require, __dirname, __filename){ // ... } - vm.runInThisContext ... // vm.runInNewContext在全局环境之外执行 vm.runInNewContext ...
dan juga tidak boleh mengakses pembolehubah tersuai Ia wujud dalam konteks pelaksanaan yang baharu. vm.runInThisContext
global
Dan kami vm.runInNewContext
mencapainya melalui global
.
Pelaksanaan require
boleh dibahagikan kepada empat langkah berikut. vm.runInThisContext
require
Baca fail yang perlu diimport.
Selepas membaca fail, masukkan kod ke dalam fungsi.
tukarkannya kepada sintaks JS melalui
.vm.runInThisContext
Kod panggilan.Andaikan kita kini mempunyai dua fail berikut. Ia adalah
a.js dan
Kita boleh menganalisis logik pelaksanaan import dan eksport melalui empat langkah di atas.
// 文件a通过module.exports导出一个变量,在文件b中使用require进行接收。 // a.js module.exports = "a" // b.js let a = require('./a'); console.log(a); // a
Perkenalkan kandungan fail yang perlu diimport ke dalam fail yang perlu diterima, dan ia akan kelihatan seperti ini
Tetapi dalam bentuk ini, Node tidak boleh menghuraikannya sama sekali, jadi kami Anda perlu meneruskan ke langkah kedua.Ekapsulkan fail baca ke dalam fungsi.let a = module.exports = "a";
Salin selepas log masuklet a = (function(exports, module, require, __dirname, __filename){ module.exports = "a"; return module.exports })(...args) // exports, module, require, __dirname, __filename 将五个参数传入
Salin selepas log masuk封装成函数的原因,我们可以参考下面这个例子。
假设我们现在传入的不是字符串,而是一个函数。
// a.js var a = 100; module.exports = function(){}
Salin selepas log masuk这样我们在解析的时候,就会被解析成下面这种格式
let a = (function(exports, module, require, __dirname, __filename){ var a = 100; module.exports = function(){}; return module.exports })(...args) // exports, module, require, __dirname, __filename 将五个参数传入
Salin selepas log masuk我们导出的是
module.exports
,所以在模块文件中定义的变量a,也只属于当前这个执行上下文。在解析的时候,变量a 会被放到函数中。真正的实现了 作用域分离。
-
vm.runInThisContext
解析成可执行的Js代码我们处理过的代码会以字符串的形式存在,所以我们需要通过
vm.runInThisContext
将字符串进行解析。 -
进行代码调用
在此之前,我们其实还需要对代码进行调试。
更多node相关知识,请访问:nodejs 教程!!
Atas ialah kandungan terperinci Menyelam mendalam ke dalam modul VM dalam Node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas





Artikel ini akan memberi anda pemahaman yang mendalam tentang memori dan pengumpul sampah (GC) enjin NodeJS V8 saya harap ia akan membantu anda!

Perkhidmatan Node yang dibina berdasarkan bukan sekatan dan dipacu peristiwa mempunyai kelebihan penggunaan memori yang rendah dan sangat sesuai untuk mengendalikan permintaan rangkaian besar-besaran. Di bawah premis permintaan besar-besaran, isu yang berkaitan dengan "kawalan memori" perlu dipertimbangkan. 1. Mekanisme kutipan sampah V8 dan had ingatan Js dikawal oleh mesin kutipan sampah

Memilih imej Docker untuk Node mungkin kelihatan seperti perkara remeh, tetapi saiz dan potensi kelemahan imej itu boleh memberi kesan yang ketara pada proses dan keselamatan CI/CD anda. Jadi bagaimana kita memilih imej Node.js Docker yang terbaik?

Modul fail ialah enkapsulasi operasi fail asas, seperti membaca/menulis/membuka/menutup/memadam fail, dsb. Ciri terbesar modul fail ialah semua kaedah menyediakan dua versi **segerak** dan ** asynchronous**, dengan Kaedah dengan akhiran penyegerakan adalah semua kaedah penyegerakan, dan kaedah yang tidak semuanya adalah kaedah heterogen.

Node 19 telah dikeluarkan secara rasmi Artikel ini akan memberi anda penjelasan terperinci tentang 6 ciri utama Node.js 19. Saya harap ia akan membantu anda!

Bagaimanakah Node.js melakukan GC (pengumpulan sampah)? Artikel berikut akan membawa anda melaluinya.

Gelung peristiwa ialah bahagian asas Node.js dan mendayakan pengaturcaraan tak segerak dengan memastikan bahawa utas utama tidak disekat Memahami gelung peristiwa adalah penting untuk membina aplikasi yang cekap. Artikel berikut akan memberi anda pemahaman yang mendalam tentang gelung acara dalam Node.

Bagaimana untuk membungkus fail boleh laku nodejs dengan pkg? Artikel berikut akan memperkenalkan kepada anda cara menggunakan pkg untuk membungkus projek Node ke dalam fail boleh laku. Saya harap ia akan membantu anda!
