【问题标题】:How to translate following nodejs code into ES6如何将以下 nodejs 代码翻译成 ES6
【发布时间】:2020-10-12 16:09:48
【问题描述】:

这是我的第一个 javascript 项目(也是十年后的第一个编程项目),所以放轻松。

我正在使用 VueJS 并使用 nodejs 的模块形式。现在,我需要向 nodejs 模块添加一些功能。我将相关文件复制到我的项目中。但是,这些文件的语法与我的代码不同(它使用 'use strict;require 而我的代码使用导出/导入。

有问题的代码如下所示:

'use strict';

var SSH = module.exports;
var Enc = require('./encoding.js');

SSH.parse = function (opts) {
  var pub = opts.pub || opts;
  var ssh = SSH.parseBlock(pub);
  ssh = SSH.parseElements(ssh);
  //delete ssh.bytes;
  return SSH.parsePublicKey(ssh);
};

/*global Promise*/
SSH.fingerprint = function (opts) {
  var ssh;
  if (opts.bytes) {
    ssh = opts;
  } else {
    ssh = SSH.parseBlock(opts.pub);
  }
  // for browser compat
  return Promise.resolve().then(function () {
    return 'SHA256:' + require('crypto').createHash('sha256')
      .update(ssh.bytes).digest('base64').replace(/=+$/g, '');
  });
};
...
...

我怎样才能把这段代码翻译成 ES6 风格。我可以在哪里导入它并拨打SSH.fingerprint(publickey)之类的电话。

【问题讨论】:

  • 指纹是一种反模式。它通过同步操作强制执行承诺,这要求调用者异步使用 SSH.fingerprint(publickey)。

标签: javascript vue.js ecmascript-6


【解决方案1】:

节点模块使用 Commonjs 模块语法。

在Node中,我们使用require来导入,相当于es6中的import。对于导出,我们使用modules.exportsexports,相当于es6 Modules 中的export 关键字

在 NodeMoules 中导入

    var Enc = require('./encoding.js');

es6 模块

    import * as Enc from './encoding.js';

在 NodeMoules 中导出

    const variable = 3;
    module.exports = {
    variable
    };

    exports.variable = 3;

es6 模块

    export const variable = 3;


编辑以回答 OP 的评论

如何翻译 var SSH = module.exports;

在节点模块中,无论您在module.exports 对象上定义什么,它都会被模块导出。这意味着如果您在其引用上定义任何内容,它也会被导出,因为它是 js 引用,它将指向同一个对象。

var SSH = module.exports;

此代码,将 module.exports 的引用保存在 SSH 变量中。如果您在 SSH 变量上定义了任何密钥,它将被导出,即 SSH.fingerprint。

所以为了在 es6 模块中导出指纹,你只需要这样做

export const fingerprint = function (opts) {
  var ssh;
  if (opts.bytes) {
    ssh = opts;
  } else {
    ssh = SSH.parseBlock(opts.pub);
  }
  // for browser compat
  return Promise.resolve().then(function () {
    return 'SHA256:' + require('crypto').createHash('sha256')
      .update(ssh.bytes).digest('base64').replace(/=+$/g, '');
  });
};

仅供参考,节点模块中的exports 关键字也是对module.exports 的引用


更新第二条评论,您的最终代码将变为:

'use strict';

import * as Enc './encoding.js';

export const parse = function (opts) {
  const pub = opts.pub || opts;
  const ssh = parseBlock(pub);
  ssh = parseElements(ssh);
  //delete ssh.bytes;
  return parsePublicKey(ssh);
};

/*global Promise*/
export const fingerprint = function (opts) {
  let ssh;
  if (opts.bytes) {
    ssh = opts;
  } else {
    ssh = parseBlock(opts.pub);
  }
  // for browser compat
  return Promise.resolve().then(function () {
    return 'SHA256:' + require('crypto').createHash('sha256')
      .update(ssh.bytes).digest('base64').replace(/=+$/g, '');
  });
};
...

【讨论】:

  • 更清晰。非常感谢。我现在有一个很好的理解。唯一的问题是ssh = SSH.parseBlock(opts.pub); 行。我要不要把它改成ssh = parseBlock(opts.pub);它是在同一个文件中本地定义的一个函数。
  • 如果在同一个文件中定义就可以了
  • 再次感谢。非常感谢您花时间解释这一点。
【解决方案2】:

这个怎么样

exports.funcName = async (params) => {
  // your code
}

在其他工作文件上

const fileName = require('../path')
//call it
fileName.funcName()

【讨论】:

  • 谢谢。这似乎是正确的方向。但是,我该如何翻译var SSH = module.exports;
  • @tinkertwain 我已经更新了我的答案来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多