电子,TypeScript,SQLite:找不到package.json

时间:2018-05-26 02:23:58

标签: node.js typescript sqlite electron

我在使用带电子的npm sqlite3包时遇到问题。我将我的电子应用程序从Typescript文件编译为Javascript,将它们与browserify捆绑在一起,然后运行主包以启动主进程。

但是当我尝试使用sqlite3时,我遇到了问题。在编译打字稿之前,我曾尝试将电子重建作为自己独立的步骤。我尝试使用--build-from-source标志安装sqlite3。但每当我尝试运行我的主捆绑包时,我得到一个" package.json不存在"错误,似乎来自我的主包中的node-pre-gyp代码,它来自sqlite3模块。

有没有人对我做错了什么有任何想法?当我已经用电子重建重建它时,我不明白为什么代码用node-pre-gyp再次构建自己。我在项目的根目录中有一个package.json,但主包在(root)/ build / js-bundles中,代码在(root)/ build中查找package.json。

我知道我的描述并不清楚,所以如果有什么不明显的话,我会尽力澄清。 (当我删除对sqlite3的依赖时,程序工作正常)。

1 个答案:

答案 0 :(得分:2)

好的,问题是我使用browserify捆绑了sqlite3依赖项。通过用--exclude标志排除sqlite3,问题就消失了。

问题似乎是构建sqlite3会生成一个sqlite3.js文件,其唯一目的是查找(并加载?)构建的node-sqlite3.node二进制文件 - 但仅限于运行时。当捆绑sqlite3并运行bundle时,它将尝试找到二进制文件,但它不能,因为我的bundle不在node_modules/sqlite目录中,它在我的build目录中。通过从browserify捆绑中排除sqlite3,在运行时,import * as sql from "sqlite3"将找到node_modules/sqlite3/sqlite3.js,找到二进制文件,然后将其加载到程序中。

该课程似乎是虽然browserify知道如何捆绑标准NodeJs模块,如fspath,但是从npm捆绑自定义本机节点模块不起作用。该程序必须在运行时找到它。

我对NodeJs的内部工作方式以及程序如何知道在build/../node_modules/sqlite3中查找sql​​ite3一无所知(我不知道它可以),所以如果有更多的话,我会很开心知识渊博可以提供细节。

另外,即使在排除了sqlite3之后,我仍然遇到了问题,因为我没有针对我的电子版本构建sqlite3。执行此操作的资源可以在electron-rebuild的一般情况下找到,如果是sqlite3,则可以在安装部分的mapbox/node-sqlite3找到。