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

如何在Node.js项目运行index.js前先执行共用的自定义脚本?

问题描述

我希望每个应用(appA、appB……N)在项目目录下运行node index.js时,先执行上级目录的../my_dir/my_script.js(该脚本为所有应用共用),目录结构如下:

+my_dir
  -my_script.js
+appA
  +node_modules
  -package.json
  -index.js
+appB
  +node_modules
  -package.json
  -index.js

my_script.js代码:

console.log('my_script.js from parent directory STARTED');

各应用的package.json(示例):

{
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    // 已尝试的配置
    "start": "node ../my_dir/my_script.js",
    "postinstall": "npm run-script ../my_dir/my_script.js",
    "preinstall": "npm run --prefix ../my_dir/my_script.js"
  }
}

各应用的index.js代码:

console.log('index.js STARTED');

当前问题:

  • 在appA目录下运行node index.js仅输出index.js STARTED
  • 运行npm start仅输出my_script.js from parent directory STARTED

期望结果:顺序输出两者内容:

my_script.js from parent directory STARTED
index.js STARTED
解决方案

方法1:同时满足npm start和node index.js的需求

如果要让两种运行方式都先执行共用脚本,最直接的方式是在每个应用的index.js开头引入my_script.js:

修改appA/index.js(appB同理):

// 先执行共用脚本
require('../my_dir/my_script.js');
console.log('index.js STARTED');

同时把package.json的start脚本改回指向index.js:

{
  "scripts": {
    "start": "node index.js"
  }
}

这样不管是运行node index.js还是npm start,都会先执行my_script.js再执行当前应用的代码。

方法2:仅修改npm start脚本(不改变index.js)

如果只需要npm start时实现顺序执行,直接修改package.json的start脚本,用&&连接两个命令:

{
  "scripts": {
    "start": "node ../my_dir/my_script.js && node index.js"
  }
}

运行npm start就会先执行共用脚本,再执行当前应用的index.js。

补充说明

你之前尝试的preinstall/postinstall是npm安装依赖时触发的钩子,和运行应用的操作无关,所以无法实现需求;而原来的start脚本只执行了共用脚本,没有继续执行index.js,所以只输出前者的内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:35:22