Я хочу запустить Nodemon и node-sass watcher вместе.
Я попробовал выполнить следующий сценарий в файле package.json.
"build-css": "node-sass --include-path scss scss/main.scss public/css/main.css",
"watch-css": "nodemon -e scss -x \"npm run build-css & nodemon server.js\""
и devDependencies:
"devDependencies": {
"node-sass": "^4.9.0",
"nodemon": "^1.17.5"
},
Это работает, но мой вопрос в том, что если я не добавлю & nodemon server.js в сценарий watch-css, он не запустит сервер и веб-приложение.
Есть ли для этого хорошее решение?
Спасибо.





Хорошо, у меня так много сейчас, я дам ответ вместо этого, но я думаю, что вопрос очень открытый! Я думаю, вам все равно придется что-то менять в зависимости от требований. В принципе, если это сработает, не беспокойтесь об этом.
Существуют различные решения, такие как npm-run-all или одновременно, но я думаю, что третий скрипт, такой как "run-both": "npm run build-css & npm run watch-css", в большинстве случаев подойдет, если вы помните, что & не является кроссплатформенным или даже кросс-шелл (например, Windows cmd vs powershell). Поэтому я бы сказал, что если вы работаете в команде, вероятно, будет проще просто добавить еще одну dev-зависимость.
Но я подскажу pm2, который, на мой взгляд, отлично работает как в производстве, так и в разработке. Экосистемные файлы особенно полезны. Я также думаю, что pm2 полностью заменяет nodemon. Не то чтобы nodemon плохой, но pm2 отлично подходит для нескольких процессов. Вот некоторые из моих сценариев npm:
"winsrv": "pm2 flush & pm2 reload server/ecosystem-win.json & pm2 logs",
"winprod": "webpack --config ./webpack.config.js & npm run winsrv",
"windev": "set NODE_ENV=development webpack --config webpack.dev.config.js"
И в заключение я добавлю, что хуки post / pre в сценариях npm очень полезны. Выполните одну команду для трех скриптов:
"preprod": "./preprod.sh", // Makes backup of old files, changes symlink to the backup
"prod": "webpack --config ./webpack.config.js && pm2 flush && pm2 reload server/ecosystem-production.json",
"postprod": "./postprod.sh", // check files exist and relinks public to the new build
Извините за задержку, я отвлекся и наткнулся на некоторые препятствия.
Я решил попробовать программный api node-sass, я не уверен, насколько это было умно, но кое-что я узнал.
buildcss.js:
var sass = require("node-sass");
var fs = require("fs");
sass.render({file: "styles.scss"}, (err, results) => {
if (err) { console.info(err); }
fs.writeFile("styles.css", results.css, err => console.info);
console.info('scss -> css complete!');
});
Поддельный server.js
console.info("server.js...");
setInterval(function() {
console.info("interval that prevents our so called server from exiting" );
}, 1000 * 60 * 60);
экосистема.json (перезапускает scss-скрипт при изменении. хм ...)
{
"apps": [
{
"name": "My Server",
"script": "server.js",
"watch" : ["server.js"]
},
{
"name": "SCSS to CSS",
"script": "buildcss.js",
"watch": ["styles.scss"],
"autorestart": false
}
]
}
И package.json
...
"scripts": {
"start": "pm2 logs && pm2 reload ecosystem.json && pm2 logs --out"
},
npm start
И я хотел бы добавить, что я обычно обрабатываю свою scss-компиляцию через webpack и не могу говорить о процессе, используемом здесь (но, похоже, он работает достаточно хорошо!).
Я думаю, что это должно быть о том, откуда вы запускаете скрипт. Вы можете добавить "cwd": "/ absolute / path", чтобы он не имел отношения к тому, где вы запускаете pm2 start.
pm2 start script.js (то же, что и nodemon, но чтобы увидеть результат, вам нужно выполнить pm2 logs или pm2 logs <id>) pm2 ls показывает запущенные процессы, pm2 stop <id> останавливается. Это важные. После этого вы можете беспокоиться об экосистеме, которая на самом деле является только способом начать pm2 с конфигурацией (какие файлы смотреть и т. д.)
Итак, большая разница с nodemon в том, что pm2 всегда помещает ваши данные в фоновый режим.
Прохладный. Не могли бы вы привести мне пример того, как выглядит код или как поместить сценарий сборки scss в css в файл package.json?
Большое спасибо за Вашу помощь. Я выполнил твою инструкцию. Я получил концепцию от этого и применил ее следующим образом, что сработало для меня:
buildcss.js (в корневом каталоге):
const sass = require('node-sass');
const fs = require('fs');
const path = require('path');
var path_style = path.resolve(__dirname, "scss")
var path_dist = path.resolve(__dirname, "public")
sass.render({file: path.join(path_style, '/main.scss')}, function (err, results) {
if (err){
console.info(err);
}
fs.writeFile(path.join(path_dist, '/css/main.css'), results.css, function (err) {
console.info(err);
});
console.info('scss --> css completed.');
});
экосистема.json (в корне):
{
"apps" : [
{
"name": "My App",
"script": "app.js",
"watch": ["app.js"]
},
{
"name": "SCSS to CSS",
"script": "buildcss.js",
"watch": ["./scss/main.scss"]
}
]
}
И package.json:
"scripts": {
"start": "pm2 start ecosystem.json && pm2 logs --out"
},
Согласно вашему коду на package.json, "start": "pm2 logs && pm2 reload ecosystem.json && pm2 logs --out", у меня это не сработало. Произошла следующая ошибка:
[TAILING] Tailing last 15 lines for [all] processes (change the value with --lines option)
[PM2][ERROR] No file to stream for app [all], exiting.npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] start: `pm2 logs && pm2 reload ecosystem.json && pm2 logs --out`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
Из файла журнала:
12 info lifecycle [email protected]~start: Failed to exec start script
package.js
-e - список расширений
https://www.npmjs.com/package/nodemon
"scripts": {
"start": "nodemon app.js -e js,scss,pug"
},
app.js
https://www.npmjs.com/package/node-sass
var result = sass.renderSync({
file: scss_filename,
[, options..]
});
Спасибо за помощь. pm2: Я установил pm2 и создал файл конфигурации pm2 экосистема простая. Я добавил следующую конфигурацию в файл config.js:
module.exports = { apps : [{ name: "app1", script: "./app.js", watch: true }, { name: "sass-build", script: "node-sass --include-path scss scss/main.scss public/css/main.css", watch: true } ] }У меня ошибка [PM2] [ERROR] скрипт не найден. Я не очень знаю, как настроить файл конфигурации pm2.