Bootstrap4 打字(index.d.ts)无法在 VisualStudio 2019 上使用 TypeScript3.9 和 Libman 找到模块“popper.js”

Posted

技术标签:

【中文标题】Bootstrap4 打字(index.d.ts)无法在 VisualStudio 2019 上使用 TypeScript3.9 和 Libman 找到模块“popper.js”【英文标题】:Bootstrap4 typings(index.d.ts) cannot find module 'popper.js' on VisualStudio 2019 with TypeScript3.9 and Libman 【发布时间】:2020-12-07 06:57:34 【问题描述】:

我将 VisualStudio 2019 与 TypeScript3.9 和 Libman 一起使用。

我需要 Bootstrap4 和 jQuery。 因此,请尝试通过 Libman 获取这些库和类型(index.d.ts)。

然后 Bootstrap4 键入(index.d.ts)得到错误“找不到模块 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 Type Definition fails to compile - Cannot find module 'popper.js' Cannot find module "popper.js" Angular 5 Visual Studio 2017 asp.net core Angular @types/bootstrap error: Namespace 'popper.js' has no exported member

只能暂时解决问题。

我将 bootstrap4 typing(index.d.ts) 更改为相对路径,因为 import * as Popper from "../popper_v1"; 是固定错误。 但是 Libman 会覆盖这个手动更改的 index.d.ts。

_

我可以做些什么来修复这个错误? 是否需要安装手动修改的 index.d.ts,比如 Popper v1.X?

谢谢。


重现错误的步骤。

    在 .Net Framework 4.8 上创建 ASP.Net4 MVC 项目

    创建 libman.json 以添加一些库和 TS 类型


  "version": "1.0",
  "defaultProvider": "jsDelivr",
  "libraries": [
    
      "library": "bootstrap@4.5.2",
      "destination": "lib/bootstrap/"
    ,
    
      "library": "@types/bootstrap@4.5.0",
      "destination": "lib/types/bootstrap/"
    ,
    
      "library": "jquery@3.5.1",
      "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/jquery@3.5.1",
      "destination": "lib/types/jquery/"
    ,
    
      "library": "@types/sizzle@2.3.2",
      "destination": "lib/types/sizzle/"
    ,
    
      "provider": "cdnjs",
      "library": "popper.js@1.16.1",
      "destination": "lib/popper.js/"
    ,
    
      "provider": "filesystem",
      "library": "lib_ManualInstallSources/popper_v1/",
      "destination": "lib/types/popper_v1/"
    
  ]

** 注意:我从 GitHub 存储库中得到了 popper.js ver.1.X 的类型(index.d.ts)。

    创建 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 typing(index.d.ts) 在import * as Popper from "popper.js"; 上收到错误“Cannot find module popper.js”。


【问题讨论】:

您是否尝试移动库顶部的popper 条目? 我更改了 libman.json 的顺序,但不幸的是它没有解决错误。 【参考方案1】:

我找到了两个要修复的图案。

    更改tsconfig.json设置为编译器可以搜索“lib”目录。 通过 Libman 将库的目录名称更改为“node_modules”(不推荐)。

这个问题是由多种原因引起的。

    TypeScript 的默认模块管理机制是基于 node.js。 Libman 默认使用“lib”目录来放置库。 库的目录名称必须与 ModuleName 相同。

[原因]

1。 TypeScript 的模块管理机制基于 node.js。

我的 tsconfig.json 有 "target": "ES5"。并且没有"module"属性。

它将"module" 属性设为默认值。而在"ES5"目标下,默认为"CommonJS"

那么,也没有“moduleResolution”属性。 所以"module": "CommonJS""moduleResolution" 属性变为"Node"

是的,编译器使用“Node”模块解析系统。

.

> TypeScript 3.9 上的“节点”解析系统

This handbook 表示,非相对导入(例如import * from "banana")将递归搜索“node_modules”目录(到父级)。

是的,目录必须命名为“node_modules”。

否则我们使用Libman,但是最新的TypeSciript的基本理论是基于“node.js”! 并且“经典”解析系统是遗留的且无用的。

最后,我们需要更改 tsconfig.json 以搜索我们的“lib”目录。 或者将目录名称更改为“node_modules”以适应“节点”解析系统(不推荐。我们使用 Libman,而不是节点)。


2。 Libman 默认使用“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”。


[如何修复]

我找到了两个要修复的图案。

    更改设置tsconfig.json为编译器可以搜索“lib”目录。 通过 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": "popper.js@1.16.1",
      "destination": "lib/popper.js/"
    ,
    
      "provider": "filesystem",
      "library": "lib_ManualInstallSources/popper_v1/",
      "destination": "lib/types/popper.js/"
    ,
    
      "library": "bootstrap@4.5.2",
      "destination": "lib/bootstrap/"
    ,
    
      "library": "@types/bootstrap@4.5.0",
      "destination": "lib/types/bootstrap/"
    ,
    
      "library": "jquery@3.5.1",
      "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/jquery@3.5.1",
      "destination": "lib/types/jquery/"
    ,
    
      "library": "@types/sizzle@2.3.2",
      "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": "popper.js@1.16.1",
      "destination": "node_modules/popper.js/"
    ,
    
      "provider": "filesystem",
      "library": "lib_ManualInstallSources/popper_v1/",
      "destination": "node_modules/types/popper.js/"
    ,
    
      "library": "bootstrap@4.5.2",
      "destination": "node_modules/bootstrap/"
    ,
    
      "library": "@types/bootstrap@4.5.0",
      "destination": "node_modules/types/bootstrap/"
    ,
    
      "library": "jquery@3.5.1",
      "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/jquery@3.5.1",
      "destination": "node_modules/types/jquery/"
    ,
    
      "library": "@types/sizzle@2.3.2",
      "destination": "node_modules/types/sizzle/"
    
  ]


【讨论】:

以上是关于Bootstrap4 打字(index.d.ts)无法在 VisualStudio 2019 上使用 TypeScript3.9 和 Libman 找到模块“popper.js”的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 打字给我“index.d.ts 不是模块”

如何在 index.d.ts 打字稿定义文件中引用 Redux 类型?

在打字稿中找不到名称“省略”

如何在 vscode 中全局引用 *.d.ts

类型 googlemaps index.d.ts 不是模块错误消息

node_modules/@types/node/index.d.ts(20,1):错误 TS1084:无效的“参考”指令语法