You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React项目使用write-json-file报Can't resolve 'node:fs'错误求助

报错根本原因

你使用的write-json-file是Node.js端专用的依赖包,底层依赖Node.js内置的fs文件系统模块。而你开发的React应用默认运行在浏览器沙箱环境中,浏览器出于安全限制不允许前端代码直接操作用户本地文件系统,也不存在node:fs这类Node.js专属模块,因此编译阶段直接抛出找不到模块的错误。
你之前可以正常导入读取data.json,是因为webpack等构建工具在打包阶段就把静态json文件的内容编译进了前端代码,并非运行时读取本地文件,和写入操作的逻辑完全不同。另外你代码里的const fs = require('fs');也是无效代码,浏览器不支持该调用,可以直接删除。

可行解决方案

根据你的需求可以任选以下一种方案实现数据持久化:

方案1:使用浏览器本地存储(最简单,适合纯前端小项目)

不用操作本地文件,直接用浏览器自带的localStorage存储待办数据,改造后代码如下:

import React, { useState, useEffect } from 'react';
import TodoForm from './TodoForm';
import Todo from './Todo';
import initData from  './data/data.json';

function TodoList() {
  // 初始化优先读取localStorage存储的内容,不存在则用导入的初始数据
  const [todos, setTodos] = useState(() => {
    const savedTodos = localStorage.getItem('todos');
    return savedTodos ? JSON.parse(savedTodos) : initData;
  });

  // 监听todos变化,每次更新自动同步到localStorage
  useEffect(() => {
    localStorage.setItem('todos', JSON.stringify(todos));
  }, [todos]);

  const addTodo = (todo) => {
    if (!todo.text || /^\s*$/.test(todo.text)) {
      return;
    }
    setTodos((todos) => [todo, ...todos]);
  };

  const updateTodo = (id, newTodo) => {
    if (!newTodo.text || /^\s*$/.test(newTodo.text)) {
      return;
    }
    setTodos((todos) => todos.map((todo) => (todo.id === id ? newTodo : todo)));
  };

  const removeTodo = (id) => {
    setTodos((todos) => todos.filter((todo) => todo.id !== id));
  };

  const completeTodo = (id) => {
    setTodos((todos) =>
      todos.map((todo) =>
        todo.id === id
          ? {
              ...todo,
              isComplete: !todo.isComplete
            }
          : todo
      )
    );
  };

  return (
    <>
      <TodoForm onSubmit={addTodo} />
      <Todo
        todos={todos}
        completeTodo={completeTodo}
        removeTodo={removeTodo}
        updateTodo={updateTodo}
      />
    </>
  );
}

export default TodoList;

该方案不需要额外安装任何依赖,数据存储在用户本地浏览器中,刷新页面不会丢失。

方案2:导出json文件到本地(需要用户手动触发)

如果你确实需要把待办数据保存为本地json文件,可以用浏览器自带的下载API实现,不需要调用Node.js相关的文件操作包:

// 新增导出函数,可绑定到页面的导出按钮点击事件
const exportToJson = () => {
  const jsonContent = JSON.stringify(todos, null, 2);
  const blob = new Blob([jsonContent], { type: 'application/json' });
  const downloadUrl = URL.createObjectURL(blob);
  const aTag = document.createElement('a');
  aTag.href = downloadUrl;
  aTag.download = 'todos.json';
  aTag.click();
  URL.revokeObjectURL(downloadUrl);
};

用户点击导出按钮后,浏览器会自动把最新的待办数据下载为json文件到本地。

方案3:修改项目内的data.json文件(需要搭配后端服务)

如果你的需求是直接修改项目源码目录下的data/data.json文件,必须额外新增后端服务层,比如用Node.js写简单的操作文件的接口,React前端发请求给后端,由后端调用fs模块操作本地文件,前端代码不能直接修改项目目录内的文件。

内容的提问来源于stack exchange,提问作者info_deniz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:36:05