【问题标题】:Could not find a declaration file for module 'drivelist'找不到模块“drivelist”的声明文件
【发布时间】:2019-04-29 05:57:17
【问题描述】:

我知道有几个关于声明文件的类似问题,但没有一个可以帮助我解决我的问题。首先,我将解释我为什么要这样做。如果您只想阅读实际问题,请继续往下阅读。

我对编程还很陌生,几个月前开始上编程学校。最近我们学会了用 HTML/CSS 和 JavaScript 创建网站,我们的老师现在希望我们学习如何使用 Node.js 和 electron 用 Ja​​vaScript 制作桌面应用程序。他给我们布置了制作硬件监视器并找到可以帮助我们的模块或框架的作业。到目前为止,我们只使用了没有任何框架的标准 JavaScript,所以这对我来说是新的。

问题: 所以我发现 Node.js 提供了 os 模块,它可以帮助您访问很多硬件和系统内容,但不能帮助您获取有关硬盘驱动器的信息。然后我用谷歌搜索并找到了驱动列表:https://www.npmjs.com/package/drivelist

我还找到了关于如何安装和使用它的简短教程。我通过npm install drivelist 安装了它并使用了该网站的示例代码,但是当我将鼠标悬停在const drivelist = require('drivelist'); 上时收到以下消息:

"Could not find a declaration file for module 'drivelist'.

'c:/Users/user.name/Documents/source/Projektarbeit/node_modules/drivelist/lib/drivelist.js'
implicitly has an 'any' type.   Try `npm install @types/drivelist` if
it exists or add a new declaration (.d.ts) file containing `declare
module 'drivelist';` [7016]"

我检查了文件夹,在 lib 文件夹中有一个 drivelist.js。我试图运行npm install @types/drivelist,但它给了我另一个错误:

npm ERR! code E404
npm ERR! 404 Not Found: @types/drivelist@latest

我在执行文件时收到以下消息:

Uncaught Error: A dynamic link library (DLL) initialization routine
failed.
\\?\C:\Users\user.name\Documents\source\Projektarbeit\node_modules\drivelist\build\Release\drivelist.node
    at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:166:20)
    at Object.Module._extensions..node (internal/modules/cjs/loader.js:740)
    at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:166:20)
    at Module.load (internal/modules/cjs/loader.js:620)
    at tryModuleLoad (internal/modules/cjs/loader.js:559)
    at Function.Module._load (internal/modules/cjs/loader.js:551)
    at Module.require (internal/modules/cjs/loader.js:658)
    at require (internal/modules/cjs/helpers.js:20)
    at bindings (C:\Users\user.name\Documents\source\Projektarbeit\node_modules\bindings\bindings.js:84)
    at Object.exports.list (C:\Users\user.name\Documents\source\Projektarbeit\node_modules\drivelist\lib\drivelist.js:52)

这是我所有的项目文件及其内容:

package.json:

{
  "name": "projektarbeit",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "start": "electron ."
  },
  "author": "",
  "license": "ISC",
  "dependencies": {},
  "devDependencies": {
    "drivelist": "^6.4.3"
  }
}

ma​​in.js:

const { app, BrowserWindow } = require('electron')

function createWindow () {

  win = new BrowserWindow({ width: 800, height: 600 })


  win.loadFile('index.html')
}

app.on('ready', createWindow)

index.html:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <script src="scripts\index.js"></script>
  </head>
  <body>

  </body>
</html>

index.js:

const drivelist = require('drivelist');

drivelist.list((error, drives) => {
    if (error) {
        throw error;
    }

    drives.forEach((drive) => {
        console.log(drive);
    });
});

我知道这可能是一个非常菜鸟的问题,但我已经尝试修复和谷歌搜索了一个小时,但只找到了不能解决我的问题的东西。

我也不知道这个建议真正想让我做什么:“添加一个包含 declare module 'drivelist'; [7016] 的新声明 (.d.ts) 文件”

【问题讨论】:

  • 我只想说:哇。感谢您在您的问题中投入如此多的思考和努力,并包含所有相关文件。我们很少会遇到这样的事情。
  • 404 错误只是说驱动列表没有任何类型。您可以通过搜索“drivelist”here 来验证这一点。不过,您不应该需要它们来运行您的应用程序,因此理论上您可以根据需要忽略警告。但是,是的,您可以在某处创建一个名为 drivelist.d.ts 的文件,在其中添加 declare module "drivelist";,然后在代码中引用该声明文件:///&lt;reference path="drivelist.d.ts"/&gt;。你得到的运行时错误是无关的,你应该问另一个问题
  • @pushkin 并且在安装 npm 模块并按照文档使用它时,这些事情都不应该发生。这里的问题是该包是为错误版本的 Node.js 构建的,因为 Electron 使用它自己的 Node.js 版本,该版本可能与用户安装的 Node.js 版本不同。是的,我承认错误消息在这种情况下并不是很有帮助,因为它们使它看起来像是一个与实际完全不同的问题。

标签: javascript node.js electron


【解决方案1】:

使用 drivelistelectron

Electron 支持原生 Node 模块,但由于 Electron 很可能使用与系统中安装的 Node 二进制文件不同的 V8 版本,因此在构建原生模块时必须手动指定 Electron 标头的位置。

...

为 Electron 安装模块和重建

您也可以选择像其他 Node 项目一样安装模块,然后使用 electron-rebuild 包为 Electron 重建模块。该模块可以获取 Electron 的版本,并处理下载标头和为您的应用构建原生模块的手动步骤。

-https://github.com/electron/electron/blob/3-0-x/docs/tutorial/using-native-node-modules.md

Electron 使用它自己的 Node.js 实例,这可能与您使用的 Node.js 版本不同。您安装的 drivelist 包是为您正在使用的 Node.js 版本构建的,并且可能不适用于 Electron 正在使用的 Node.js 版本。

幸运的是,有一个方便的工具可以重新构建需要为您重新构建的本机节点模块,它被方便地命名为 electron-rebuild

  1. 确保在安装 Node.js 时安装了 BuildTools。如果你不这样做,electron-rebuild 将退出并说它成功,但什么都不做。

  2. 确保electron 包安装在您的项目本地(即没有-g--global 标志),而不是全局安装,否则您必须将全局电子版本传递给electron-rebuild

     > npm install electron@^3.0.10
    
  3. 在本地安装electron-rebuild

     > npm install electron-rebuild
    
  4. 在本地安装drivelist

     > npm install drivelist
    
  5. 重建原生模块

     > ./node_modules/.bin/electron-rebuild
    

如果您想将其合并到 Electron 应用的安装中,请将 postinstall 属性添加到您的 package.json 文件中的脚本对象,并将其指向 electron-rebuild 可执行文件

...
"scripts": {
    "start": "./node_modules/.bin/electron .",
    "postinstall": "./node_modules/.bin/electron-rebuild"
},
...

修改后的package.json文件:

{
  "name": "projektarbeit",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "start": "./node_modules/.bin/electron .",
    "postinstall": "./node_modules/.bin/electron-rebuild"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "drivelist": "^6.4.3",
    "electron": "^3.0.10",
    "electron-rebuild": "^1.8.2"
  }
}

附带说明,您确实应该按照 Electron 开发人员的建议处理窗口关闭:

const { app, BrowserWindow } = require('electron')

let mainWindow

function createWindow () {
  mainWindow = new BrowserWindow({ width: 800, height: 600 })

  mainWindow.loadFile('index.html')

  mainWindow.on('closed', function () {
    mainWindow = null
  })
}

app.on('ready', createWindow)

app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', function () {
  if (mainWindow === null) {
    createWindow()
  }
})

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    相关资源
    最近更新 更多