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');
}