【问题标题】:Requiring files in electron without babel在没有 babel 的情况下需要电子文件
【发布时间】:2018-08-01 17:53:49
【问题描述】:

我正在尝试将 Web 应用程序转换为电子应用程序。我有多个函数,在我使用转译器导入到我的 main.js 的不同文件中。

但是,每当我尝试在我的电子应用程序中执行此操作时,我都会遇到一个模块问题,我正在使用该模块来摆脱使用 php 来访问我的数据库。相反,我在 npm 上使用 mysql 模块。

我想将此函数保存在自己的文件中,然后在 main.js 中使用它。当我尝试使用 babel 对其进行转换时,我收到一个关于 Net.Connection 不起作用(或类似的东西)的错误。据我了解,这是因为 Node 的工作方式。我很高兴能解决这个问题,但我希望有一种方法可以将此函数保存在另一个文件中,并且无需使用 babel 即可导入它。

function loadColourFilter(){
  var mysql      = require('mysql');
  let query_result;

  var connection = mysql.createConnection({
    host     : 'xxxxxxxxxxxx',
    user     : 'xxxxxxxxxxxx',
    password : 'xxxxxxxxxxxx',
    database : 'xxxxxxxxxxxx'
  });

  connection.connect();
  let query = "xxxxxxxxxxxxxxxx";
  connection.query(query, function (error, results, fields) {

  });

  connection.end();
  return (query_result);

}

编辑:我删除了该功能的某些部分以确保凭据安全等等。我相当肯定他们的缺席在尝试解决这个问题时不会改变任何事情。

编辑: 我的项目目录本质上是

src
--- js
--- --- main.js
    --- functionFile.js // This would be where my loadColourFilter function above would be saved
--- node_modules
--- --- ...
--- index.html // js/main.js is referenced in a script tag here.
--- main.js // Where the electron window is created.
--- package.json

【问题讨论】:

    标签: javascript mysql node.js npm electron


    【解决方案1】:

    应该有2个js上下文,一个在electron app中运行,一个在node.js中运行。如果您处于电子上下文(类似于浏览器 js 上下文)中,您将无法直接从您的目录中要求您编写脚本。

    我只是假设是这种情况,因为我们没有得到很多关于您的问题的信息,而其他答案应该已经解决了您的问题。

    尝试在 index.html 中包含你的 js 文件,看看发生了什么。

    编辑:由于它是 babel 的转译错误,因此当它应该为浏览器转译时,babel 可能正在转译节点。

    【讨论】:

    • 我想我理解你所说的两种不同的上下文,但我可以在我的项目中使用一些帮助来区分它们。我已经编辑了我的初始问题以包含我的项目目录
    【解决方案2】:

    您可以使用 NodeJS 轻松创建一个简单的本地模块,方法是创建一个源文件,然后添加一个 module.exports 分配以从文件中导出一些功能/变量/等。在您的情况下,类似于名为 colourFilter.js 的文件,其内容为:

    function load(){
      var mysql      = require('mysql');
      let query_result;
    
      var connection = mysql.createConnection({
        host     : 'xxxxxxxxxxxx',
        user     : 'xxxxxxxxxxxx',
        password : 'xxxxxxxxxxxx',
        database : 'xxxxxxxxxxxx'
      });
    
      connection.connect();
      let query = "xxxxxxxxxxxxxxxx";
      connection.query(query, function (error, results, fields) {
    
      });
    
      connection.end();
      return (query_result);
    
    }
    
    module.exports = load
    

    然后在您想要使用它的代码中通过执行以下操作来包含它:

    loadColourFilter = require('colourFilter.js')
    

    并使用类似的功能

    let result = loadColourFilter()
    

    这是一种将代码拆分为多个文件/类/模块的简单方法,但仍将一个主文件/类/模块作为重要的文件/类/模块作为面向公众的部分或入口点。当然,您不必使用我上面使用的名称:P

    如果你想创建一个对象样式的模块,你可以导出一个类似的对象

    module.exports = {
      load
    }
    

    或者

    module.exports = {
      load: loadFunctionNameInThisFile
    }
    

    然后像这样使用它

    const colourFilter = require('colourFilter.js')
    
    let result = colourFilter.load()
    

    【讨论】:

    • 问题是,当我尝试做这样的事情时,我收到错误“找不到模块 'colourFilter.js'” 我尝试在 require 中添加路径,如 colourFilter = require( './colourFilter.js') 也是如此,但没有运气。
    • 对不起。该路径可能是问题,因为./ 指向当前目录中的文件。如果它位于主脚本上方的文件夹中,则可以使用..,例如,如果主脚本在project/src/ 中,而模块在project/ 中,则可以使用./../module.js。如果它在当前目录下的文件夹中,例如如果主脚本在project/src/ 并且模块在project/src/lib 你可以使用./lib/module.js。如果这仍然失败,请分享您的 Node + NPM 版本并在上面的净化模块源(或至少它的基础)中进行编辑。
    • 我所有的脚本都存储在同一个目录中。所以我会有 js/main.js 然后 js/colourFilter.js 仍然没有运气。
    • 有趣。我刚才用一个非常基本的 Electron 应用程序进行了测试,该应用程序只有 Electron + mysql 作为与 this JSFiddle 中代码的依赖项(JS 部分中的多个文件由 cmets 拆分)并且运行它没有问题。您是否尝试过跳过 Babel(如果可能),或者让它跳过该文件?还发现我在上面错了,因为单一导出样式只直接导出一个函数,它被导入到你称之为的任何东西,而不是作为一个对象。编辑了我的答案以纠正该问题;对于错误信息,我深表歉意。
    猜你喜欢
    • 2018-02-02
    • 2012-01-26
    • 1970-01-01
    • 2018-07-13
    • 2017-09-08
    • 2018-08-21
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    相关资源
    最近更新 更多