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

如何在Node.js中替换package.json中的name变量?

问题:替换package.json模板中的变量

场景与需求

我有一个package.json模板文件,内容如下:

{"name":"$name"}

需要在Node.js中完成以下操作:

  • 将该模板复制到以用户输入的应用名称命名的文件夹中
  • 更新package.json内的name字段,把模板里的$name替换为用户输入的应用名称

现有代码

我已编写的部分代码:

const fs = require('fs');
const prompt = require('prompt-sync')();

let appName = prompt('what is application name..?');
if(!appName){
    appName='temp'
}

console.log(`Application name is ${appName}`);

if (!fs.existsSync(`${appName}`)){
    fs.mkdirSync(`${appName}`);
}

fs.copyFile('./source/package.json', `${appName}/package.json`, (err) => {
  if (err) throw err;
  console.log('source.txt was copied to destination.txt');
});

当前问题

运行代码后可以创建对应名称的文件夹并复制文件,但无法将$name替换为用户输入的应用名称(比如输入abc),期望最终的package.json内容为:

{"name":"abc"}

解决方案

fs.copyFile是直接复制文件内容,不具备变量替换能力。需要改为读取模板内容→替换变量→写入目标文件的流程,以下是修改后的代码:

同步版本(脚本场景更简洁)

const fs = require('fs');
const prompt = require('prompt-sync')();

let appName = prompt('what is application name..?');
if(!appName){
    appName='temp'
}

console.log(`Application name is ${appName}`);

const targetDir = `./${appName}`;
// 创建目标文件夹(不存在则创建)
if (!fs.existsSync(targetDir)){
    fs.mkdirSync(targetDir);
}

try {
    // 读取模板文件的字符串内容
    const templateContent = fs.readFileSync('./source/package.json', 'utf8');
    // 替换模板中的$name变量
    const updatedContent = templateContent.replace('$name', appName);
    // 将替换后的内容写入目标文件
    fs.writeFileSync(`${targetDir}/package.json`, updatedContent);
    console.log('package.json已生成并完成变量替换');
} catch (err) {
    console.error('处理文件时出错:', err);
}

异步版本(非阻塞场景适用)

如果需要避免同步操作阻塞进程,可以使用异步API:

const fs = require('fs').promises;
const prompt = require('prompt-sync')();

let appName = prompt('what is application name..?');
if(!appName){
    appName='temp'
}

console.log(`Application name is ${appName}`);

const targetDir = `./${appName}`;

(async () => {
    try {
        // 检查文件夹是否存在,不存在则创建
        await fs.access(targetDir).catch(() => fs.mkdir(targetDir));
        // 异步读取模板内容
        const templateContent = await fs.readFile('./source/package.json', 'utf8');
        // 替换变量
        const updatedContent = templateContent.replace('$name', appName);
        // 异步写入目标文件
        await fs.writeFile(`${targetDir}/package.json`, updatedContent);
        console.log('package.json已生成并完成变量替换');
    } catch (err) {
        console.error('处理文件时出错:', err);
    }
})();

核心逻辑说明

  1. 读取模板时指定utf8编码,确保拿到的是可操作的字符串内容
  2. 使用String.replace()方法精准替换模板中的$name标识
  3. 将替换后的内容直接写入目标位置,替代原有的直接复制操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:16:06