温馨提示  2024年 6月我们已经停止开发者板块文章内容更新,谢谢来访。存档数据
知识 2023-08-25 46 次阅读

浅析ecmascript模块中nodejs如何加载json文件

    ecmascript模块中node如何加载json文件》下面本篇文章就来给大家介绍一下nodejs在ecmascript 模块中加载json文件的方法,希望对大家有所帮助!

看完本文,你将学到

1. nodejs 如何加载、解析json文件

2. fs 模块如何读取json文件

3. 学到import.meta.url

3. 学到new url()

4. 学到load-json-file库

家喻户晓,如果是在commonjs模块中加载json文件,只需通过require()函数直接加载即可,即能得到json对象。

但是在ecmascript模块中直接加载json文件,会报错,报错如下

首先,先启用esm模式,其实官方文档(http://nodejs.cn/api/esm.html#introduction)中也有说明

node.js 默认将 javascript 代码视为 commonjs 模块。 作者可以借助.mjs文件扩展名、package.jsontype字段、或--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 apiconst 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模块函数,path或filename参数可以作为使用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方法实现。

三、 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 源码 整体而言相对比较简单,但是也有很多可以学习深挖的学习的知识点。

更多node相关知识,请访问nodejs 教程!!