如何在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
相关产品推荐
相关产品推荐

