typescript - האם יש דרך להשתמש ב-npm scripts כדי להריץ tsc -watch && nodemon --watch?
אני מחפש דרך להשתמש בסקריפטים של npm כדי להריץ tsc --watch && nodemon --watch בו זמנית. אני יכול להריץ את הפקודות האלה בנפרד, אבל כשאני רוצה להריץ את שתיהן, רק הראשונה מתבצעת. לדוגמה:
"scripts": {
"runDeb": "set NODE_ENV=development&& tsc --watch && nodemon --watch"
}
tsc --watch מבוצע אך nodemon אף פעם לא נקרא, ולהפך.
תשובה #1
אני חושב שזה מה שאתה רוצה משהו כזה (ההגדרה הנוכחית שלי):
"scripts": {
"compile": "tsc && node app.js",
"dev": "./node_modules/nodemon/bin/nodemon.js -e ts --exec \"npm run compile\""
}
יצרתי שני סקריפטים "compile" ו-"dev". כדי להתחיל לפתח אתה פשוט מריץ npm run dev שמפעיל את nodemon וגורם לו לפקח על קבצי .ts (באמצעות הדגל -e). ואז, כל פעם שקובץ .ts משתנה, nodemon יריץ exec את משימת ה-compile שמבצעת בעצם קומפילציה והרצה של אפליקציית ה-node.
בעוד ששימוש ב-concurrently הוא אפשרות טובה, ההתקנה שלי מבטיחה שעבודתו של tsc תושלם לפני שניסע להריץ את קבצי ה-.js הנוצרים.
תשובה #2
אני משתמש בפתרון של AlterX כבר זמן מה והוא עבד באופן מושלם, אבל גיליתי שהוא די איטי. במקום זאת, אני משתמש עכשיו ב-tsc-watch. זה מאפשר ל-tsc להשתמש בקומפילציה אינקרמנטלית בדומה לדגל -w, מה שהופך את אתחול האפליקציה למהיר יותר.
זה כל כך קל כמו לשים משהו דומה לזה בקובץ package.json שלך:
"scripts": {
"start": "tsc-watch --onSuccess \"node .\""
}
תשובה #3
נסה להוסיף את זה ל-package.json שלך:
"scripts": {
"start": "concurrently --kill-others \"tsc -w\" \"nodemon dist/app.js\"",
}
וגם הוסף את חבילות ה-npm האלה (concurrently, nodemon, typescript) ל-package.json שלך:
"devDependencies": {
"concurrently": "^2.2.0",
"typescript": "^1.8.10",
"nodemon": "^1.9.2",
}
תשובה #4
מה קורה
הבעיה היא שיש כאן שני צופים על כל הקבצים. אחד הוא tsc -w ואחד הוא nodemon.
כאשר מתבצעת שינוי בקובץ .ts, tsc מזהה זאת, מתרגם אותו ויוצר את הגרסה .js בתיקיית היעד שלך.
עכשיו, מנקודת המבט של Nodemon, הוא מזהה לפחות שני שינויים -- אחד עבור .ts ואחד עבור .js. בשינוי הראשון הוא מתחיל את עצמו מחדש, אבל בשינוי השני הוא לא יודע שהתרחש 'start' נוסף כבר, אז הוא מנסה להתחיל מחדש שוב וזה נכשל. לדעתי זאת באג של nodemon -- ראו https://github.com/remy/nodemon/issues/763.
פתרונות
1) השתמש ב-tsc-watch --onSuccess
ל-tsc-watch יש --onSuccess שניתן להכניס אליו node. כך יהיה לך רק צופה אחד.
2) דחיית nodemon
אתה יכול לעכב בקלות את הפעלות המחודשות של nodemon (ראה --delay). זה דורש את שינוי ההגדרה המינימלי ביותר.
3) לגרום ל-nodemon לנטר רק את תיקיית היעד של TSC
לא הצלחתי להפעיל את זה, אבל בדרך הזו nodemon יזהה תקווה רק שינוי אחד. זה עלול לגרום לבעיות בעתיד או כאשר tsc מייצר קבצים מרובים.
תשובה #5
הפתרון שלי ב-אוקטובר 2018 באמצעות הגרסאות החדשות ביותר של nodemon.
ראשון:
התקן את nodemon(npm install nodemon --save-dev) ואת ts-node(npm install ts-node --save-dev)
שני:
צור קובץ nodemon.json. אני אוהב לשמור את הקונפיגורציה של nodemon בקובץ nodemon.json נפרד כדי להקל קצת על קריאת סקריפטים של npm. לכן צור את nodemon.json בשורש הפרויקט עם התוכן הבא:
{
"ignore": ["**/*.test.ts", "**/*.spec.ts", ".git", "node_modules"],
"watch": ["src"], // your .ts src folder
"exec": "npm start", // your npm script created in package.json
"ext": "ts"
}
לאחר מכן צור את הסקריפט שלך npm start לדוגמה כך:
"scripts": {
...
"start": "ts-node src/server.ts",
"dev:ts": "nodemon",
...
}
לאחר מכן הרץ npm run dev:ts או yarn dev:ts אמור להריץ ולצפות בקוד השרת שלך ב-TypeScript.
לעוד הגדרות כמו Jest יחידות בדיקה וכו'… אתם יכולים להציץ במאמר הזה
