找不到模块“驱动器列表”的声明文件

时间:2018-11-27 13:15:25

标签: javascript node.js electron

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

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

问题: 因此,我发现Node.js提供了os模块,该模块可以帮助您访问很多硬件和系统内容,但不能帮助您获取有关硬盘驱动器的信息。然后,我用Google搜索并找到了驱动器列表: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"
  }
}

main.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)文件”

1 个答案:

答案 0 :(得分:0)

drivelistelectron一起使用

  

Electron支持本机节点模块,但是由于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()
  }
})