Helo Fellow Dev!
Hari ini, kita akan membincangkan perbezaan antara .mjs (modul ECMAScript) dan .cjs (modul CommonJS) dalam Node.js. Walaupun rangka kerja moden seperti React, Next.js dan Vue sering mengendalikan sokongan modul secara automatik, memahami perbezaan ini adalah penting apabila bekerja dengan Node.js secara langsung, terutamanya berkaitan gelung acara dan susunan pelaksanaan.
Matlamat utama saya untuk perbincangan ini adalah ke arah gelung acara dan dalam bahagian seterusnya, kita akan melihat beberapa kes.
import fs from 'fs' import https from 'https'
const fs = require('fs') const https = require('https')
Gelung acara Node.js memproses baris gilir yang berbeza dengan peranan dan keutamaan tertentu. Dua fungsi penting yang mempengaruhi susunan pelaksanaan ialah process.nextTick() dan setImmediate() dan kami menggunakan ini dari semasa ke semasa.
Jika anda tahu perbezaan antara process.nextTick vs setImmediate itu bagus jika tidak, idea yang sangat asas
process.nextTick memastikan bahawa sekeping kod berjalan selepas fungsi semasa tetapi sebelum sebarang operasi I/O tak segerak.
setImmediate menjadualkan fungsi panggil balik untuk dilaksanakan dalam lelaran seterusnya bagi gelung acara, selepas sebarang acara I/O.
Jadi kod semasa -> process.nextTick -> sebarang operasi I/O -> setSegera
Mari kita periksa coretan kod yang menunjukkan susunan pelaksanaan:
//In case of mjs import https from "https"; import fs from "fs"; //In case of cjs const https = require("https"); const fs = require("fs"); setImmediate(() => { console.log("setImmediate callback"); }); process.nextTick(() => { console.log("nextTick callback"); }); fs.readFile("./async.cjs", (err, data) => { console.log("file IO Callback"); }); fs.readdir(process.cwd(), () => console.log("file IO Callback 2")); https.get("https://www.google.com", (res) => { console.log("https callback"); }); setImmediate(() => { console.log("setImmediate callback 2"); }); Promise.resolve().then(() => { console.log("Promise Callback"); }); process.nextTick(() => { console.log("Process nextTick console"); process.nextTick(() => { console.log("Process nextTick console 2"); process.nextTick(() => { console.log("Process nextTick console 3"); process.nextTick(() => { console.log("Process nextTick console 4"); }); }); }); }); Promise.resolve().then(() => { console.log("Promise Callback 2"); }); console.log("Main thread mjs"); Promise.resolve().then(() => { console.log("Promise Callback 3"); });
Kod harus dijalankan dan dilaksanakan dengan cara ini
Main thread mjs Promise Callback Promise Callback 2 Promise Callback 3 nextTick callback Process nextTick console Process nextTick console 2 Process nextTick console 3 Process nextTick console 4 setImmediate callback setImmediate callback 2 file IO Callback file IO Callback 2 https callback
Tetapi adakah ia berlaku dengan mjs?
Tidak Betul!
Ini ialah output wrt mjs dan cjs
Sama seperti process.nextTick dan setImmediate, kita boleh melihat tingkah laku yang sama dengan Promises juga.
Nampaknya, perbezaan dalam tingkah laku yang kami perhatikan antara fail mjs (modul ECMAScript) dan cjs (modul CommonJS) berkenaan setImmediate dan process.nextTick adalah disebabkan oleh cara Node.js mengendalikan gelung acara dan tugas mikro dalam sistem modul yang berbeza .
Saya telah menguji gelagat ini dalam apl Express dan Nextjs (mod dev) dan menariknya, Express berkelakuan seperti cjs dan Nextjs berkelakuan seperti mjs . Set log pertama adalah daripada Express dan seterusnya daripada Nextjs
Memahami perbezaan dalam susunan pelaksanaan antara fail .mjs dan .cjs adalah penting apabila bekerja secara langsung dengan Node.js. Saya harap, ini akan membantu anda memahami perbezaan dan pelaksanaan fail wrt fungsi ini, sedikit lebih baik. Jadi lain kali apabila anda bermain atau mencuba fungsi ini dalam apl anda, ingat perkara ini :)
Untuk contoh lain, sila rujuk dokumentasi rasmi Node.js tentang perbezaan antara modul ES dan pelaksanaan fail CommonJS.
Atas ialah kandungan terperinci mjs vs cjs dengan Gelung Acara. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!