Javascript 中缺少模块,但 Typescript 中没有

Posted

技术标签:

【中文标题】Javascript 中缺少模块,但 Typescript 中没有【英文标题】:Missing module in Javascript but not in Typescript 【发布时间】:2021-05-29 21:42:23 【问题描述】:

我正在按照指南编写 vscode 扩展程序,但在我的 server.ts 文件中遇到了导入问题。这是文件树:

????test
 ┣ ????client
 ┃ ┣ ????out
 ┃ ┣ ????src
 ┃ ┃ ┗ ????index.ts
 ┃ ┣ ????package-lock.json
 ┃ ┣ ????package.json
 ┃ ┗ ????tsconfig.json
 ┣ ????server
 ┃ ┣ ????out
 ┃ ┣ ????src
 ┃ ┃ ┣ ????completions.ts
 ┃ ┃ ┣ ????parser.ts
 ┃ ┃ ┗ ????server.ts
 ┃ ┣ ????package-lock.json
 ┃ ┣ ????package.json
 ┃ ┣ ????tsconfig.json
 ┃ ┗ ????yarn.lock
 ┣ ????package.json
 ┗ ????tsconfig.json

与扩展示例 provided by Microsoft 的结构相同。

但是,在 server.ts 中,我尝试从 vscode 模块导入一些元素:

//server.ts

import  workspace as Workspace  from 'vscode';

let sm_home: string = Workspace.getConfiguration("sourcepawnLanguageServer").get("sourcemod_home");
...

在我的 package.json 中,我有:

  "dependencies": 
    "@types/glob": "^5.0.30",
    "@types/uuid": "^3.4.0",
    "@types/vscode": "^1.14.0",
    "glob": "^7.1.2",
    "uuid": "^3.1.0",
    "vscode-languageserver": "^7.0.0",
    "vscode-languageserver-textdocument": "^1.0.1",
    "vscode-test": "1.5.1",
    "vscode-uri": "^3.0.2"
  ,

整个项目编译正常,但是当我启动扩展时,出现以下错误:

Error: Cannot find module 'vscode'
Require stack:
- c:\Users\Charles\CloudStation\Documents\Perso\Dev\sourcepawn-vscode\server\out\server.js
    at Function._resolveFilename (internal/modules/cjs/loader.js:1019:15)
    at internal/modules/cjs/loader.js:895:27
    at Function._load (electron/js2c/asar_bundle.js:5:12738)
    at Module.require (internal/modules/cjs/loader.js:1079:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at Object.<anonymous> (c:\Users\Charles\CloudStation\Documents\Perso\Dev\sourcepawn-vscode\server\out\server.js:5:18)
    at Module._compile (internal/modules/cjs/loader.js:1199:30)
    at Object..js (internal/modules/cjs/loader.js:1220:10)
    at Module.load (internal/modules/cjs/loader.js:1039:32)
    at internal/modules/cjs/loader.js:932:14 
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    'c:\\Users\\Charles\\CloudStation\\Documents\\Perso\\Dev\\sourcepawn-vscode\\server\\out\\server.js'
  ]

如果我在server.ts 文件中删除导入和使用导入的行,错误就会消失。 此导入在 index.ts` Could this be due to the fact that server.tsis called inside ofindex.ts` 中运行良好?

import  ExtensionContext, workspace as Workspace, window, commands  from 'vscode';
import  LanguageClient, LanguageClientOptions, ServerOptions, TransportKind  from 'vscode-languageclient/node';
import * as glob from 'glob';
import * as path from 'path';

export const sm_home: string = 'Workspace.getConfiguration("sourcepawnLanguageServer").get("sourcemod_home")';

export function activate(context: ExtensionContext) 
    let serverModule = context.asAbsolutePath(
        path.join('server', 'out', 'server.js')
...

这似乎并不困扰the C/C++ extension.

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

一段时间后发现发生了什么:

在 vscode 扩展内的语言服务器实例中使用 vscode 不起作用,因为(据我了解)服务器不像扩展那样与 vscode 一起运行。

如果您需要设置、工作区的 uris 等,您应该使用 connection.workspace...,但请记住请求将是异步的。

查看如何创建connection 对象here 的示例。

【讨论】:

你能详细说明一下吗?您从哪里获得“连接”实例?【参考方案2】:

vscode 包已被弃用。它现在被分成两个包,分别是@types/vscodevscode-test。这次重构的原因可以在here找到。

您已包含 @types/vscode 依赖项,但未包含 vscode-test

添加 vscode-test 依赖项应该可以解决您的问题,即

npm i vscode-test

同时确保你有:

"engines":  "vscode": "^1.32.0" 

在您的 package.json 文件中定义。

【讨论】:

感谢您的回复,不幸的是这不起作用,我仍然遇到同样的错误,我相应地编辑了问题中的 package.json 文件。 可能是一个愚蠢的问题,但是您是否明确安装了依赖项?例如npm install 刚刚检查过,是的,我在删除每个node_modules 文件夹后运行npm install,并重新创建了文件夹。 好的,要尝试的另一件事是确保您的 package.json 中有 "engines": "vscode": "^1.32.0",。提出此建议,因为代码是从“vscode”导入的。 也确保了这一点,但我现在知道问题出在哪里,我正在尝试做的事情不会奏效,因为我正在从语言服务器实例导入 vscode

以上是关于Javascript 中缺少模块,但 Typescript 中没有的主要内容,如果未能解决你的问题,请参考以下文章

由于缺少实际文件夹,已安装 python 模块但无法导入 - 怎么办?

heroku 应用程序由于缺少模块而崩溃,但可以在 localhost 上运行

discord.js 机器人缺少模块?

Rails:预编译资产缺少节点模块

框架比较

我在 XMLHttpRequest 中缺少啥?