Node.js menyokong sintaks import Ia adalah titik pengetahuan yang mudah, tetapi ia boleh mengingatkan kita untuk keluar daripada salah faham pengetahuan, memberi lebih perhatian kepada dunia luar pengetahuan dan sentiasa membuka sempadan pengetahuan kita sendiri.
Spesifikasi modular arus perdana hadapan, pada masa ini terdapat yang berikut:
Oleh itu, terdapat dua spesifikasi arus perdana, CommonJS
dan ESM
, tetapi kerana Node.js tidak menyokong ESM
spesifikasi, banyak kali Terdapat dua kod standard wujud bersama dalam projek kami, jadi situasi berikut berlaku:
// 在node端执行构建的时候 const _ = require('loadsh') // 在浏览器端实现的时候 import _ from 'loadsh';
Dengan cara ini, titik kesakitan mudah berlaku dalam pembangunan Selalunya penyelesaian kami adalah untuk menyelesaikannya melalui pelbagai alatan pembinaan Contohnya: webpack
vite
, terutamanya apabila kita menulis skrip kompilasi node.js dalam projek, kita sering perlu menukar. [Tutorial berkaitan yang disyorkan: tutorial video nodejs, Pengajaran pengaturcaraan]
Tetapi selepas versi Node.js V14+, ia mula menyokong spesifikasi ESM, anda boleh terus Sintaks seperti import
export
digunakan dalam Node.js akhirnya saya menunggu hari ini?
PS: Sebenarnya, ciri ini telah ditambah seawal Node.js V8.5, tetapi ia sentiasa diperlukan untuk mendayakan ciri ini melalui pembolehubah global –experimental-modules
Disebabkan ketidakstabilan, kebanyakan projek tidak menghidupkannya, tetapi sejak 16+, kami boleh menggunakannya dengan berani dalam projek, tetapi beberapa projek purba mengesyorkan untuk tidak menghidupkannya buat masa ini.
Mari kita baca arahan yang berkaitan daripada laman web rasmi:
Melalui perkara di atas kita boleh mengetahui beberapa kaedah penggunaan:Node.js mempunyai dua spesifikasi modul:
CommonJS
Spesifikasi Modul danECMAScript
Spesifikasi Modul Pembangun boleh memberitahu Node.js untuk menggunakan spesifikasi.mjs
untuk melaksanakan kod dengan menetapkan benderapackage.json
atautype=module
dalam sambungan failnode xxx.js --input-type
. Tanpa tetapan ini, Node.js akan menggunakanECMAScript
untuk pelaksanaan.CommonJS
Modul Node.js: Modul ECMAScript
, apabila node.js dimuatkan, ia akan menggunakan spesifikasi .mjs
secara automatik ESM
dalam projek, kemudian .js dalam keseluruhan projek Fail akan dilaksanakan mengikut package.json
spesifikasi "type":"module"
ESM
--input-type
Pelbagai kaedah penggunaan 1. Kaedah konvensional:
2 >3. Sokonganimport _ from 'lodash'; import { readFile } from 'fs'; import Demo from './Demo.mjs'; // 绝对路径或相对路径都可以 export readFile; export default readFile;
// 由于参数不同, 这个会让`foo.mjs`被加载两次,而不会利用缓存中的`foo.mjs` import './foo.mjs?query=1'; // loads ./foo.mjs with query of "?query=1" import './foo.mjs?query=2'; // loads ./foo.mjs with query of "?query=2"
data:
import 'data:text/javascript,console.log("hello!");'; // text/javascript 会将后面的内容当成js模块 import { test } from 'data:text/javascript,function test(){console.log("test")};export {test};'; // 这里我们是不是扩宽思路,直接加载在线js呢? import _ from 'data:application/json,"world!"' assert { type: 'json' }; // application/json 则是json // application/wasm for Wasm
json
5. Muatkan modul spesifikasi commonjs javascript
webassembly
Sudah tentu , ia juga menyokong pemuatan modul spesifikasi commonjs, penggunaannya adalah seperti berikut:
import fooData from './foo.json' assert { type: 'json' };
6 import() import asynchronous Penggunaan ini sangat biasa. Ia tidak perlu dimuatkan dalam masa nyata Ia akan dimuatkan apabila diperlukan
7. Menyokong import daripada http/https (ciri eksperimen)import { default as cjs } from 'cjs'; // module.exports 导出 import cjsSugar from 'cjs'; // module.exports import * as m from 'cjs';
const { default: barData } = await import('./bar.json', { assert: { type: 'json' } });
import worker_threads from 'node:worker_threads'; import { configure, resize } from 'https://example.com/imagelib.mjs'; configure({ worker_threads });
Satu-satunya sekatan: apabila spesifikasi ESM dihidupkan, anda hanya dibenarkan untuk mengisi atau , tidak dibenarkan menggunakan atau , dan ralat akan dilaporkan:
import
export
Ringkasanrequire
module.exports
const a = require('a') ^ ReferenceError: require is not defined in ES module scope, you can use import instead at file:///Users/borfyqiu/Desktop/study/github/qiubohong.github.io/code/demo-rollup/test.mjs:4:12 at ModuleJob.run (node:internal/modules/esm/module_job:193:25) at async Promise.all (index 0) at async ESMLoader.import (node:internal/modules/esm/loader:530:24) at async loadESM (node:internal/process/esm_loader:91:5) at async handleMainPromise (node:internal/modules/run_main:65:12)
Untuk lebih banyak pengetahuan berkaitan nod, sila lawati:
tutorial nodejs!
Atas ialah kandungan terperinci Analisis ringkas tentang cara menggunakan sintaks import dalam nod. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!