typescript - Bootstrap4 ტიპები (index.d.ts) ვერ პოულობს მოდულს 'popper.js' VisualStudio 2019-ში TypeScript 3.9 და Libman-თან ერთად


მე ვიყენებ VisualStudio 2019-ს TypeScript3.9-სა და Libman-თან ერთად.

და მე მჭირდება Bootstrap4 და jQuery. ასე რომ, სცადეთ ეს ბიბლიოთეკები და ტიპები (index.d.ts) მიიღოთ Libman-ის საშუალებით.

შემდეგ Bootstrap4-მა typing (index.d.ts) დააფიქსირა შეცდომა „Cannot find module popper.js“.

// Type definitions for Bootstrap 4.5
// Project: https://github.com/twbs/bootstrap/, https://getbootstrap.com
// Definitions by: denisname <https://github.com/denisname>
//                 Piotr Błażejewicz <https://github.com/peterblazejewicz>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.3

/// <reference types="jquery"/>

import * as Popper from "popper.js";     // ERROR!: "Cannot find module popper.js"

მე შევნიშნე მსგავსი პრობლემები და პასუხები.

  • Bootstrap 4 TypeScript ტიპის განსაზღვრის კომპილაცია ვერ ხერხდება - მოდული 'popper.js' ვერ მოიძებნა
  • მოდიული "popper.js" ვერ მოიძებნა Angular 5 Visual Studio 2017 asp.net core
  • Angular @types/bootstrap შეცდომა: ნეიმსფეისი 'popper.js'-ს არ აქვს ექსპორტირებული წევრი

ეს მხოლოდ დროებით შეძლებდა პრობლემის მოგვარებას.

მე შევაცვლე bootstrap4-ის ტაიფინგი (index.d.ts) რელატიურ გზაზე, როგორც import * as Popper from "../popper_v1";, ეს შეცდომა გამოსწორდა. მაგრამ Libman გადაულახავს ამ მანუალურად შეცვლილ index.d.ts-ს.

_

რა შემიძლია გავაკეთო ამ შეცდომის გასასწორებლად? ხომ არ მიწევს index.d.ts-ის ხელით მოდიფიცირებული ვერსიის ინსტალაცია, როგორც Popper v1.X-ში?

გმადლობთ.


შეცდომის გამეორების ნაბიჯები.

  1. შექმენით ASP.Net4 MVC პროექტი .Net Framework 4.8-ზე

  2. შექმენით libman.json რამდენიმე ბიბლიოთეკისა და TS ტიპების დასამატებლად

{
  "version": "1.0",
  "defaultProvider": "jsDelivr",
  "libraries": [
    {
      "library": "[email ",
      "destination": "lib/bootstrap/"
    },
    {
      "library": "@types/[email ",
      "destination": "lib/types/bootstrap/"
    },
    {
      "library": "[email ",
      "destination": "lib/jquery/",
      "files": [
        "dist/jquery.js",
        "dist/jquery.min.js",
        "dist/jquery.min.map",
        "dist/jquery.slim.js",
        "dist/jquery.slim.min.js",
        "dist/jquery.slim.min.map",
        "external/sizzle/LICENSE.txt",
        "external/sizzle/dist/sizzle.js",
        "external/sizzle/dist/sizzle.min.js",
        "external/sizzle/dist/sizzle.min.map",
        "AUTHORS.txt",
        "LICENSE.txt",
        "README.md"
      ]
    },
    {
      "library": "@types/[email ",
      "destination": "lib/types/jquery/"
    },
    {
      "library": "@types/[email ",
      "destination": "lib/types/sizzle/"
    },
    {
      "provider": "cdnjs",
      "library": "[email ",
      "destination": "lib/popper.js/"
    },
    {
      "provider": "filesystem",
      "library": "lib_ManualInstallSources/popper_v1/",
      "destination": "lib/types/popper_v1/"
    }
  ]
}

** შენიშვნა: მე მივიღე popper.js ვერსია 1.X-ის typing(index.d.ts) GitHub-დან.

  1. შექმენით tsconfig.json
{
  "compilerOptions": {
    "noImplicitAny": false,
    "noEmitOnError": true,
    "removeComments": false,
    "sourceMap": true,
    "target": "es5",
    "lib": [ "ES6", "DOM" ],
    "baseUrl": ".",
    "typeRoots": [
      "./lib/types"
    ]
  },
  "exclude": [
    "node_modules",
    "wwwroot",
    "lib"
  ]
}

ამ ნაბიჯების შემდეგ, bootstrap4 ტიპირება (index.d.ts) მიიღებს შეცდომას „Cannot find module popper.js“ import * as Popper from "popper.js"; ხაზზე.


პასუხი #1

მე ვიპოვე ორი ნიმუში გასასწორებლად.

  1. შეცვალეთ tsconfig.json-ის პარამეტრები, რათა კომპილატორმა შეძლოს „lib“ დირექტორიის მოძებნა.
  2. ბიბლიოთეკების დირექტორიის სახელის შეცვლა Libman-ის მეშვეობით "node_modules"(არ არის რეკომენდებული).

ეს პრობლემა გამოწვეულია მრავალი მიზეზით.

  1. TypeScript-ის ნაგულისხმევი მოდულის მართვის მექანიზმი დაფუძნებულია node.js-ზე.
  2. Libman სტანდარტულად იყენებს "lib" დირექტორიას ბიბლიოთეკების განთავსებისთვის.
  3. ბიბლიოთეკის დირექტორიების სახელები უნდა ემთხვეოდეს ModuleName-თან.

[მიზნები]

1. TypeScript-ის მოდულების მართვის მექანიზმი ეფუძნება node.js-ს.

ჩემი tsconfig.json შეიცავს "target": "ES5". და არ აქვს "module" თვისება.

ეს განსაზღვრავს "module" თვისებას როგორც სტანდარტულს. ხოლო "ES5" მიზნის შემთხვევაში, სტანდარტული არის "CommonJS".

შემდეგ, "moduleResolution"-ის თვისებაც არ აქვს. ასე რომ "module": "CommonJS" ქმნის "moduleResolution" თვისებას "Node"-ის.

კი, კომპილატორი იყენებს „Node“ მოდულის გარჩევის სისტემას.

.

> „Node“ რეზოლუციის სისტემა TypeScript 3.9-ში

ამ სახელმძღვანელო წერს, რომ არაპოზიციონალური იმპორტი (მაგალითად import * from "banana") გამოძიებას გაუწევს "node_modules" დირექტორიას რეკურსიულად (მშობლის მიმართულებით).

კი, დირექტორია უნდა სახელდებულიყო როგორც „node_modules“.

სხვა შემთხვევაში ვიყენებთ Libman-ს, მაგრამ ყველაზე ბოლო TypeScript-ის ძირითადი თეორია დაფუძნებულია "node.js"-ზე!
და "კლასიკური" რეზოლუციის სისტემა არის ძველი და უვარგისი.

ბოლოს, საჭიროა tsconfig.json-ის შეცვლა იმისთვის, რომ მოძებნოს ჩვენი „lib“ დირექტორია. ან შეცვალეთ დირექტორიის სახელი „node_modules“-ად, რათა მოარგოთ „Node“-ის განლაგების სისტემას (არ არის რეკომენდებული. ჩვენ ვამოწმენდ Libman-ს, არა node-ს).


2. ლიბმანი იყენებს "lib" დირექტორიას ბიბლიოთეკების დაყენებისათვის სტანდარტულად.

როგორც მიზეზი 1, ჩვენ გვჭირდება "node_modules" დირექტორია. მაგრამ libman-ის სტანდარტული დირექტორიის სახელი არის "lib".

ეს მიზეზი კომპილატორს არ აძლევს საშუალება ეძიონ ბიბლიოთეკები „lib“ დირექტორიაში.


3. ბიბლიოთეკის დირექტორიების სახელები უნდა ემთხვეოდეს ModuleName-ს.

თუ არატანარიცული იმპორტი გამოიყენება (მაგ. import * from "banana"), კომპილატორი ეძებს "./node_modules/banana.js(ts)" ან "./node_modules/banana/*".

ჩემი libman.config-ში არის popper.js ვერსიის 1.X ტიპიზაცია (.d.ts).

{
  "provider": "filesystem",
  "library": "lib_ManualInstallSources/popper_v1/",
  "destination": "lib/types/popper_v1/"
}

დიახ... ჩემი "desitination" თვისება არის "popper_v1".

ეს არასწორედ სახელწოდებულია. import * as Popper from "popper.js" ვერ პოულობს ამ დირექტორიას. საჭიროა დირექტორიის სახელის შეცვლა "lib/types/popper.js"-ში.


[როგორ შევასწოროთ]

მე ვიპოვე ორი ნიმუში გასასწორებლად.

  1. შეცვალეთ tsconfig.json-ის პარამეტრები, რათა კომპილატორმა შეძლოს „lib“ დირექტორიის მოძებნა.
  2. ბიბლიოთეკების საქაღალდის სახელის ცვლილება Libman-ის საშუალებით "node_modules"-ზე (არ არის რეკომენდებული).

მთავარ არჩევანს ვთავაზობ ვიყენოთ 1. იმიტომ, რომ ჩვენ ვხმარობთ Libman-ს, არა Node-ს. თუ ვნახავთ „node_modules“ დირექტორიას, ეს იწვევს მცდარ წარმოდგენას, რომ ჩვენ ვიყენებთ Node-ს.

თუმცა, მისი შეცვლისას "node_modules"-ზე, საერთო კონფიგურაცია შეიძლება უფრო მარტივად გამოიყურებოდეს.


1. შეცვალეთ tsconfig.json პარამეტრები ისე, რომ კომპილატორმა შეძლოს „lib“ დირექტორიის ძიება.

// tsconfig.json
{
  "compilerOptions": {
    "sourceMap": true,
    "target": "es5",
    "lib": [ "ES6", "DOM" ],
    "baseUrl": ".",
    "typeRoots": [
      "./node_modules/@types", // Default path to search typings.
      "./lib/types"            // Directory of typings that located by Libman.
    ],
    "paths": {
      // If absolute module name provided on .ts/.d.ts files, compiler will check "./lib/moduleName", "./lib/types/moduleName".
      // e.g. 'import * as Popper from "popper.js"' is convert to "./lib/popper.js" and "./lib/types/popper.js".
      //      Then "./lib/types/popper.js" is correctly path. Error fixed.
      "*": [ "lib/*", "lib/types/*" ]
    }
  },
  "exclude": [
    "node_modules",
    "wwwroot",
    "lib"
  ]
}
// libman.json
{
  "version": "1.0",
  "defaultProvider": "jsDelivr",
  "libraries": [
    {
      "provider": "cdnjs",
      "library": "[email ",
      "destination": "lib/popper.js/"
    },
    {
      "provider": "filesystem",
      "library": "lib_ManualInstallSources/popper_v1/",
      "destination": "lib/types/popper.js/"
    },
    {
      "library": "[email ",
      "destination": "lib/bootstrap/"
    },
    {
      "library": "@types/[email ",
      "destination": "lib/types/bootstrap/"
    },
    {
      "library": "[email ",
      "destination": "lib/jquery/",
      "files": [
        "dist/jquery.js",
        "dist/jquery.min.js",
        "dist/jquery.min.map",
        "dist/jquery.slim.js",
        "dist/jquery.slim.min.js",
        "dist/jquery.slim.min.map",
        "external/sizzle/LICENSE.txt",
        "external/sizzle/dist/sizzle.js",
        "external/sizzle/dist/sizzle.min.js",
        "external/sizzle/dist/sizzle.min.map",
        "AUTHORS.txt",
        "LICENSE.txt",
        "README.md"
      ]
    },
    {
      "library": "@types/[email ",
      "destination": "lib/types/jquery/"
    },
    {
      "library": "@types/[email ",
      "destination": "lib/types/sizzle/"
    }
  ]
}

2. შეცვალეთ ბიბლიოთეკების დირექტორიის სახელი Libman-ის საშუალებით „node_modules“-ში (არ საპროცენტოდ რეკომენდებულია).

{
  "compilerOptions": {
    "sourceMap": true,
    "target": "es5",
    "lib": [ "ES6", "DOM" ],
    "baseUrl": "."
  },
  "exclude": [
    "node_modules",
    "wwwroot",
    "lib"
  ]
}
{
  "version": "1.0",
  "defaultProvider": "jsDelivr",
  "libraries": [
    {
      "provider": "cdnjs",
      "library": "[email ",
      "destination": "node_modules/popper.js/"
    },
    {
      "provider": "filesystem",
      "library": "lib_ManualInstallSources/popper_v1/",
      "destination": "node_modules/types/popper.js/"
    },
    {
      "library": "[email ",
      "destination": "node_modules/bootstrap/"
    },
    {
      "library": "@types/[email ",
      "destination": "node_modules/types/bootstrap/"
    },
    {
      "library": "[email ",
      "destination": "node_modules/jquery/",
      "files": [
        "dist/jquery.js",
        "dist/jquery.min.js",
        "dist/jquery.min.map",
        "dist/jquery.slim.js",
        "dist/jquery.slim.min.js",
        "dist/jquery.slim.min.map",
        "external/sizzle/LICENSE.txt",
        "external/sizzle/dist/sizzle.js",
        "external/sizzle/dist/sizzle.min.js",
        "external/sizzle/dist/sizzle.min.map",
        "AUTHORS.txt",
        "LICENSE.txt",
        "README.md"
      ]
    },
    {
      "library": "@types/[email ",
      "destination": "node_modules/types/jquery/"
    },
    {
      "library": "@types/[email ",
      "destination": "node_modules/types/sizzle/"
    }
  ]
}