站長資訊網
最全最豐富的資訊網站

淺析ECMAScript模塊中nodejs如何加載json文件

ECMAScript模塊中node如何加載json文件》下面本篇文章就來給大家介紹一下nodejs在ECMAScript 模塊中加載json文件的方法,希望對大家有所幫助!

淺析ECMAScript模塊中nodejs如何加載json文件

看完這篇文章,你將學到:

1、nodejs 如何加載、解析json文件

2、fs 模塊如何讀取json文件

3、學到import.meta.url

3、學到new URL()

4、學到load-json-file庫

眾所周知,如果是在CommonJS模塊中加載json文件,只需通過require()函數直接加載即可,即能得到json對象。

但是在ECMAScript模塊中直接加載json文件,會報錯,報錯如下:

淺析ECMAScript模塊中nodejs如何加載json文件

首先,先啟用ESM模式,其實官方文檔(http://nodejs.cn/api/esm.html#introduction)中也有說明:

Node.js 默認將 JavaScript 代碼視為 CommonJS 模塊。 作者可以通過 .mjs 文件擴展名、package.json "type" 字段、或 --input-type 標志告訴 Node.js 將 JavaScript 代碼視為 ECMAScript 模塊

那怎么才能在ECMAScript模塊加載json文件呢?其實是有兩種方案的:

假設現在有一個json文件:test.json

文件內容如下:

{     "name": "project" }

接下來,在index.js中引入test.json:

一、 通過 fs 文件系統讀取 json 文件

import { readFile } from "fs/promises"; // 以promise的方式引入 readFile API  const json = JSON.parse(     await readFile(new URL('./test.json', import.meta.url)) )  console.log('[json1]:', json); // 輸出: { "name": "project" }

解釋:

await: 根據 ECMAScript 頂層 await 提案,await 關鍵字可用于模塊內的頂層(異步函數之外);

import.meta.urlnodejs中返回模塊在本地的file://協議的絕對路徑,例如:file://home/user/main.js, 如果模塊中還有另外一個文件test.js,那么test.js的路徑就是new URL('test.js', import.meta.url)

new URL: 生成file: 協議的對象(對于大多數 fs 模塊函數,pathfilename 參數可以作為使用 file: 協議的對象傳入)。

二、 通過nodejs內置module模塊的createRequire方法實現

import { createRequire } from "module";  const require = createRequire(import.meta.url); const json = require('./test.json');  console.log('[json2]:', json); // 輸出: { "name": "project" }

這種方法是根據nodejs提供的createRequire方法實現。

淺析ECMAScript模塊中nodejs如何加載json文件

三、 24行源碼的第三方庫 load-json-file

load-json-file 是我在npm網站無意間發現的,源碼只有僅僅24行,如下:

import {readFileSync, promises as fs} from 'node:fs';  const {readFile} = fs;  const parse = (buffer, {beforeParse, reviver} = {}) => {  	// Unlike `buffer.toString()` and `fs.readFile(path, 'utf8')`, `TextDecoder`` will remove BOM.         // 這里對buffer進行轉義,沒有用`buffer.toString()`和`fs.readFile(path, 'utf8')`,是因為`new TextDecoder().decode(buffer)`這種方式可以刪除字節順序標記(BOM)                  // 解碼 buffer 并返回字符串 	let data = new TextDecoder().decode(buffer);                  // 在parse解析之前對字符串進行處理 	if (typeof beforeParse === 'function') { 		data = beforeParse(data); 	}  	return JSON.parse(data, reviver); };  // 導出異步方法 export async function loadJsonFile(filePath, options) {         // 如果未指定編碼,則返回原始緩沖區。 	const buffer = await readFile(filePath); 	return parse(buffer, options); }  // 導出同步方法 export function loadJsonFileSync(filePath, options) {         // 如果未指定編碼,則返回原始緩沖區。 	const buffer = readFileSync(filePath); 	return parse(buffer, options); }

load-json-file 源碼 整體而言相對比較簡單,但是也有很多可以學習深挖的學習的知識點。

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
国产精品午夜爆乳美女视频| 孩交videos精品乱子豆奶视频| 国产999精品久久久久久| 国产精品亚洲综合天堂夜夜| 99久久做夜夜爱天天做精品| 久久精品国产男包| 99re5精品视频在线观看| 国产成人精品午夜福利| 中文字幕精品久久| 精品一区二区三区免费视频| 一区二区国产精品| 日韩人妻无码精品无码中文字幕 | 精品久久国产视频| 亚洲国产高清国产拍精品| 国产成人精品日本亚洲专区6| 91精品国产高清久久久久 | 国产亚洲女在线线精品| 国产色婷婷精品免费视频| 午夜精品在线免费观看| www亚洲精品久久久乳| 伊人无码精品久久一区二区| 交换国产精品视频一区| 91精品视频免费| 亚洲精品天堂在线观看| 精品丝袜国产自在线拍亚洲| 精品福利一区二区三区免费视频| 亚洲麻豆精品果冻传媒| 亚洲国产精品美女| 精品亚洲AV无码一区二区 | 中日韩精品电影推荐网站| 亚洲日韩国产成网在线观看 | 无码精品人妻一区二区三区免费看 | 无码精品人妻一区二区三区中| 久久久亚洲精品国产| 四虎成人精品无码| 1313午夜精品理伦片| 精品国产一区二区三区色欲 | 亚洲av日韩av天堂影片精品| 日韩精品视频一区二区三区| 亚洲一日韩欧美中文字幕在线| 日韩精品人妻系列无码av东京|