javascript - איך למצוא את המודול "fs" ב-VS Code עם TypeScript?
אני עובד על MacBook Air. התקנתי את VS Code כסביבת פיתוח (IDE) וגם התקנתי TypeScript.
יש לי קובץ פשוט עם השורה הזו בלבד:
import fs = require('fs');
אני מקבל קו אדום מתנדנד מתחת ל-'fs' בתוך הסוגריים והודעת השגיאה היא [ts] Cannot find module 'fs'. לקובץ יש סיומת .ts. אני חדש ב-JavaScript וב-TypeScript, אבל היה לי הרושם ש-fs הוא מודול ליבה, אז איך זה יכול שלא להיות נמצא? איך אני פותר את הבעיה?
דברים אחרים שכבר ניסיתי:
- הכנסת גוף פונקציה פשוט לקובץ ואז קומפילציה בשורת הפקודה עם
tsc. אני מקבל שם שגיאה שווה ערך למעשה:error TS2307: Cannot find module 'fs'. - בשורת הפקודה
sudo npm install fs -g. הדבר מדווח על הצלחה נראית לעין, אך לא פותר את הבעיה.
חפרתי ב-SE ובאינטרנט, אבל התשובות שנראו קרובות משתמע ש-׳fs׳ זמין.
תשובה #1
אתה צריך לכלול את קובץ ההגדרות של node.
TypeScript 2.0+
התקן באמצעות npm:
npm install --save-dev @types/node
TypeScript < 2.0
אם אתה משתמש ב-typings, אז אתה יכול להריץ את הפקודה הזו:
typings install dt~node --global --save
או אם אתה משתמש ב-typings < 1.0 הפעל:
typings install node --ambient --save
או אם כל השאר נכשל, הורד את הקובץ ידנית כאן וכלל אותו בפרויקט שלך.
תשובה #2
יש עכשיו דרך טובה יותר בלי להיכנס ל-tsd הקודם או לכלי typings. ל-NPM עכשיו יש את חבילת @types ל-TypeScript. בדוגמה הזו אתם צריכים את החבילה @types/node:
npm install "@types/node" --save-dev
ודא שאתה משתמש באופציה save-dev כדי להתקין את סוגי הקבצים רק במצב פיתוח, ולא בפרודקשן. עליך שיהיו לך הספריות האחרונות של Node כאשר אתה משתמש בתחביר npm install "@types/"...
זה לא מוצא את חבילת fs מכיוון שסביר שההגדרות של הכלים הקודמים לא משתמשות בקובץ ההגדרות node.d.ts האחרון.
קובץ tsconfig.json שלך צריך להיות מעודכן כדי למצוא חבילות סוגים אלה. הדוגמה שלי משתמשת ב-jquery, jqueryui ו-node types. בהנחה שאתה צריך שהתחביר יעבוד גם עבור עורך הקוד שלך, במקרה זה עורך הקוד 'atom'
{
"compileOnSave": false,
"compilerOptions": {
"rootDir": "src",
"sourceMap": true,
"target": "es5",
"module": "amd",
"declaration": false,
"noImplicitAny": false,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"moduleResolution": "node",
"lib": ["es2015", "dom"],
"baseUrl": "./",
"typeRoots": [
"node_modules/@types"
],
"types": [
"jquery",
"jqueryui",
"node"
],
"paths": {
"src/*": ["src/*"]
}
},
"exclude": [
"node_modules",
"dist",
"build"
],
"filesGlob": [
"./src/**/*.ts",
"./test/**/*.ts",
"./typings/index.d.ts",
"./custom_typings/**/*.d.ts",
"./node_modules/@types/**/*.d.ts"
],
"atom": {
"rewriteTsconfig": false
}
}
תשובה #3
"fs" הוא מודול ליבה של Node ואני חושב שהסינטקס של משפט הייבוא שלך קצת לא מדויק. נסה:
import * as fs from "fs";
תשובה #4
כל מה שאתה צריך הוא להגדיר את "moduleResolution" כ"node" בקובץ tsconfig.json שלך:
{
"compilerOptions": {
...
"moduleResolution": "node"
...
}
}
לבצע
npm install @types/node --save-dev
ועכשיו אתה יכול להשתמש בייבוא TypeScript סטנדרטי:
import * as fs from "fs";
תשובה #5
יש לך שלוש אפשרויות ב-tsconfig.json (כאן: Node 11+), ראה את המסמכים:
או לציין גם את typeRoots וגם את types, רק את typeRoots או למחוק את שני השורות לחלוטין (מומלץ):
{"compilerOptions": {
...
"typeRoots": ["node_modules/@types"], // "typeRoots": [] -> won't work
"types": ["node"] // "types": [] -> won't work
}}
סוגי התקנה:
npm install --save-dev @types/node
השתמש במערכת קבצים מבוססת הבטחה (למשל כדי להשתמש ב-async/await):
import {promises as fs} from 'fs';
async function foo() {
...
await fs.writeFile('./yourPath', 'YourContent');
}
