Jadual Kandungan
Dalam teks di atas, saya telah menekankan satu konsep, iaitu pencemaran pembolehubah.
Rumah hujung hadapan web tutorial js Menyelam mendalam ke dalam modul VM dalam Node.js

Menyelam mendalam ke dalam modul VM dalam Node.js

Nov 22, 2021 pm 07:36 PM
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!

Menyelam mendalam ke dalam modul VM dalam Node.js

Rujukan vm mesin maya | >

Dalam artikel sebelum ini, kami menyebut masalah.

Bagaimanakah rentetan boleh ditukar menjadi JS untuk pelaksanaan?

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. Functioneval boleh memperoleh pembolehubah global, jadi ia mungkin masih mempunyai pencemaran berubah-ubah.

ialah prinsip pelaksanaan
global.a = 100; // 挂在到全局对象global上
var b = 200; // this !== global
new Function("console.log(a)")() // 100
new Function("console.log(b)")() // b is not defined
Salin selepas log masuk
enjin modul

saya akan menerbitkan artikel untuk menerangkannya secara berasingan pada masa hadapan. FunctionFunctionTerdapat penyelesaian lain, yang tidak kami kembangkan secara terperinci dalam artikel lepas, dan itu ialah modul

.

vmmodul 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.js
const vm = require('vm')
global.a = 100;
// 运行在当前环境中[当前作用域]
vm.runInThisContext('console.log(a)'); // 100
// 运行在新的环境中[其他作用域]
vm.runInNewContext('console.log(a)'); // a is not defined
Salin selepas log masuk
dikongsi di bawah berbilang modul, jadi cuba jangan mentakrifkan atribut dalam global .

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
Salin selepas log masuk

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 ...
Salin selepas log masuk
tidak boleh mengakses

dan juga tidak boleh mengakses pembolehubah tersuai Ia wujud dalam konteks pelaksanaan yang baharu. vm.runInThisContextglobalDan kami vm.runInNewContext mencapainya melalui global.

Pelaksanaan require boleh dibahagikan kepada empat langkah berikut. vm.runInThisContext

requireBaca fail yang perlu diimport.

  • Selepas membaca fail, masukkan kod ke dalam fungsi.

  • tukarkannya kepada sintaks JS melalui

    .
  • vm.runInThisContextKod panggilan.

  • Andaikan kita kini mempunyai dua fail berikut. Ia adalah

    a.js
  • dan
b.js

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
Salin selepas log masuk

Baca fail.
  • 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.

    let a = module.exports = "a";
    Salin selepas log masuk

    Ekapsulkan fail baca ke dalam fungsi.
  • let 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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

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

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Penjelasan grafik terperinci tentang memori dan GC enjin Node V8 Penjelasan grafik terperinci tentang memori dan GC enjin Node V8 Mar 29, 2023 pm 06:02 PM

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

Artikel tentang kawalan memori dalam Node Artikel tentang kawalan memori dalam Node Apr 26, 2023 pm 05:37 PM

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

Mari kita bincangkan tentang cara memilih imej Node.js Docker terbaik? Mari kita bincangkan tentang cara memilih imej Node.js Docker terbaik? Dec 13, 2022 pm 08:00 PM

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?

Mari bercakap secara mendalam tentang modul Fail dalam Node Mari bercakap secara mendalam tentang modul Fail dalam Node Apr 24, 2023 pm 05:49 PM

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.js 19 dikeluarkan secara rasmi, mari bercakap tentang 6 ciri utamanya! Node.js 19 dikeluarkan secara rasmi, mari bercakap tentang 6 ciri utamanya! Nov 16, 2022 pm 08:34 PM

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!

Mari bercakap tentang mekanisme GC (pengumpulan sampah) dalam Node.js Mari bercakap tentang mekanisme GC (pengumpulan sampah) dalam Node.js Nov 29, 2022 pm 08:44 PM

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

Mari kita bincangkan tentang gelung acara dalam Node Mari kita bincangkan tentang gelung acara dalam Node Apr 11, 2023 pm 07:08 PM

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.

Mari kita bincangkan tentang cara menggunakan pkg untuk membungkus projek Node.js ke dalam fail boleh laku. Mari kita bincangkan tentang cara menggunakan pkg untuk membungkus projek Node.js ke dalam fail boleh laku. Dec 02, 2022 pm 09:06 PM

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!

See all articles