node.js支持import語法,很簡單一個知識點,但是卻能提醒我們從知識誤區(qū)里走出來,多關注外邊的知識世界,不斷打開自己的知識邊界。
(資料圖片)
前端主流模塊化規(guī)范,目前有以下幾種:
CommonJS, Node.js提出的規(guī)范ECMAScript Module,ESM,由ECMAScript組織提出的JavaScript標準規(guī)范已淘汰的有:CMD、AMD等,再就綜合體UMD(支持各種規(guī)范的集合體)因此,主流有兩種規(guī)范CommonJS和ESM兩種規(guī)范,但是由于Node.js不支持ESM規(guī)范,導致很多時候我們的項目里面并存兩種規(guī)范的代碼,從而出現(xiàn)下面這種情況:
// 在node端執(zhí)行構建的時候const _ = require("loadsh")// 在瀏覽器端實現(xiàn)的時候import _ from "loadsh";這樣子開發(fā)就很容易出現(xiàn)痛點,往往我們的解決方案就是通過各種構建工具去解決,如:webpackvite,尤其是我們在寫項目中寫node.js編譯腳本,經(jīng)常需要切換。【相關教程推薦:nodejs視頻教程、編程教學】
但是從Node.js V14+版本后,它開始支持ESM規(guī)范啦,你可以直接在Node.js中使用importexport等語法了,終于等到這一天?。
PS: 其實早在Node.js V8.5版本就已經(jīng)加入該特性了,只不過一直需要通過全局變量–experimental-modules去開啟這一特性,由于不穩(wěn)定性大多數(shù)項目都沒有開啟,不過自從16+后,我們就可以大膽放心在項目中使用了,不過一些古老的項目建議暫時不用開啟。
我們先從官網(wǎng)上去看相關使用說明:
通過上述我們就可以知道幾個使用方式:
將文件后綴改為.mjs,node.js加載的時候自動會用ESM規(guī)范
在項目中package.json新增配置項"type":"module",那么整個項目中的.js文件都會按照ESM規(guī)范去執(zhí)行
增加執(zhí)行參數(shù)--input-type也可以實現(xiàn)相同效果
各種使用方式
1、常規(guī)方式:
import _ from "lodash";import { readFile } from "fs";import Demo from "./Demo.mjs"; // 絕對路徑或相對路徑都可以export readFile;export default readFile;2、帶參數(shù)的使用:
// 由于參數(shù)不同, 這個會讓`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"
3、支持data:格式URL的形式
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 Wasm4、assert斷言(實驗特性)將文件強制加載為某種格式內容,如:jsonjavascriptwebassembly等
import fooData from "./foo.json" assert { type: "json" };5、加載commonjs規(guī)范模塊
當然肯定也支持加載commonjs規(guī)范的模塊,用法如下:
import { default as cjs } from "cjs"; // module.exports 導出import cjsSugar from "cjs"; // module.exportsimport * as m from "cjs";6、import() 異步導入這種用法就很正常,不需要實時加載,等到需要用的時候再加載
const { default: barData } = await import("./bar.json", { assert: { type: "json" } });7、支持從http/https引入(實驗特性)
目前屬于實驗特性,有限制,比如:
不支持http2/3協(xié)議http協(xié)議只能用于127.0.0.1等本地ip地址Cookie、Authorization等信息不會攜帶發(fā)送只會加載執(zhí)行遠端的js文件,而不會加載遠端中依賴其他文件import worker_threads from "node:worker_threads";import { configure, resize } from "https://example.com/imagelib.mjs";configure({ worker_threads });限制
唯一的限制:當開啟ESM規(guī)范后,你只允許填寫import或export,不允許使用require或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)其實這個也不算是冷門知識,只要稍微對Node.js有做持續(xù)關注,基本上都可以了解到該特性。
但是作為不關注的人,很容易就陷入自己的知識誤區(qū),會一直認為Node.js不支持ESM規(guī)范,甚至會吐槽Node.js為什么不支持呢?
所以這里有一句話需要提醒自己—— 【書山無路勤為徑,學海無涯苦作舟】。
更多node相關知識,請訪問:nodejs 教程!
以上就是淺析node中怎么使用import語法的詳細內容,更多請關注php中文網(wǎng)其它相關文章!
關鍵詞: