【问题标题】:os.hostname() is empty after transpiling through babel通过 babel 转译后 os.hostname() 为空
【发布时间】:2017-08-08 00:45:09
【问题描述】:

所以,我正在 ES6/node.js 中编写一个服务器端应用程序。下面是有问题的代码。我知道这不是 ES6,但应用程序的其他部分是(理想情况下,我会使用 ES6 的导入 - 我只是退回到 require,因为我想在节点本身测试原始代码而不需要转译。

var os = require("os");
var hostname = os.hostname();
console.log(hostname);

所以,如果我有一个名为 test.js 的 JavaScript 文件,其中包含该代码...然后我将它扔到节点上,我会在控制台上打印正确的主机名。

但是如果我通过 babel 运行它,当我运行它时,我什么也得不到。完全没有输出。

有趣的是,如果我将这一行添加到代码中:

console.log(os)

然后原始 JS 给我这个输出:

{ hostname: [Function: getHostname],
  uptime: [Function: getUptime],
  freemem: [Function: getFreeMem],
  totalmem: [Function: getTotalMem],
  cpus: [Function: getCPUs],
  type: [Function: getOSType],
  release: [Function: getOSRelease],
  networkInterfaces: [Function: getInterfaceAddresses],
  homedir: [Function: getHomeDirectory],
  userInfo: [Function: getUserInfo],
  loadavg: [Function: loadavg],
  constants:
   { UV_UDP_REUSEADDR: 4,
     errno:
      { E2BIG: 7,
        EACCES: 13,
        EADDRINUSE: 98,
        EADDRNOTAVAIL: 99,
        EAFNOSUPPORT: 97,
        EAGAIN: 11,
        EALREADY: 114,
        EBADF: 9,
        EBADMSG: 74,
        EBUSY: 16,
        ECANCELED: 125,
        ECHILD: 10,
        ECONNABORTED: 103,
        ECONNREFUSED: 111,
        ECONNRESET: 104,
        EDEADLK: 35,
        EDESTADDRREQ: 89,
        EDOM: 33,
        EDQUOT: 122,
        EEXIST: 17,
        EFAULT: 14,
        EFBIG: 27,
        EHOSTUNREACH: 113,
        EIDRM: 43,
        EILSEQ: 84,
        EINPROGRESS: 115,
        EINTR: 4,
        EINVAL: 22,
        EIO: 5,
        EISCONN: 106,
        EISDIR: 21,
        ELOOP: 40,
        EMFILE: 24,
        EMLINK: 31,
        EMSGSIZE: 90,
        EMULTIHOP: 72,
        ENAMETOOLONG: 36,
        ENETDOWN: 100,
        ENETRESET: 102,
        ENETUNREACH: 101,
        ENFILE: 23,
        ENOBUFS: 105,
        ENODATA: 61,
        ENODEV: 19,
        ENOENT: 2,
        ENOEXEC: 8,
        ENOLCK: 37,
        ENOLINK: 67,
        ENOMEM: 12,
        ENOMSG: 42,
        ENOPROTOOPT: 92,
        ENOSPC: 28,
        ENOSR: 63,
        ENOSTR: 60,
        ENOSYS: 38,
        ENOTCONN: 107,
        ENOTDIR: 20,
        ENOTEMPTY: 39,
        ENOTSOCK: 88,
        ENOTSUP: 95,
        ENOTTY: 25,
        ENXIO: 6,
        EOPNOTSUPP: 95,
        EOVERFLOW: 75,
        EPERM: 1,
        EPIPE: 32,
        EPROTO: 71,
        EPROTONOSUPPORT: 93,
        EPROTOTYPE: 91,
        ERANGE: 34,
        EROFS: 30,
        ESPIPE: 29,
        ESRCH: 3,
        ESTALE: 116,
        ETIME: 62,
        ETIMEDOUT: 110,
        ETXTBSY: 26,
        EWOULDBLOCK: 11,
        EXDEV: 18 },
     signals:
      { SIGHUP: 1,
        SIGINT: 2,
        SIGQUIT: 3,
        SIGILL: 4,
        SIGTRAP: 5,
        SIGABRT: 6,
        SIGIOT: 6,
        SIGBUS: 7,
        SIGFPE: 8,
        SIGKILL: 9,
        SIGUSR1: 10,
        SIGSEGV: 11,
        SIGUSR2: 12,
        SIGPIPE: 13,
        SIGALRM: 14,
        SIGTERM: 15,
        SIGCHLD: 17,
        SIGSTKFLT: 16,
        SIGCONT: 18,
        SIGSTOP: 19,
        SIGTSTP: 20,
        SIGTTIN: 21,
        SIGTTOU: 22,
        SIGURG: 23,
        SIGXCPU: 24,
        SIGXFSZ: 25,
        SIGVTALRM: 26,
        SIGPROF: 27,
        SIGWINCH: 28,
        SIGIO: 29,
        SIGPOLL: 29,
        SIGPWR: 30,
        SIGSYS: 31,
        SIGUNUSED: 31 } },
  arch: [Function],
  platform: [Function],
  tmpdir: [Function],
  tmpDir: [Function],
  getNetworkInterfaces: [Function: deprecated],
  EOL: '\n',
  endianness: [Function] }

转译后的代码给了我这个输出

{ endianness: [Function],
  hostname: [Function],
  loadavg: [Function],
  uptime: [Function],
  freemem: [Function],
  totalmem: [Function],
  cpus: [Function],
  type: [Function],
  release: [Function],
  getNetworkInterfaces: [Function],
  networkInterfaces: [Function],
  arch: [Function],
  platform: [Function],
  tmpDir: [Function],
  tmpdir: [Function],
  EOL: '\n' }

我下载并安装了 babel 插件“transform-inline-environment-variables”,我的 .babelrc 包含该行

"plugins": ["transform-inline-environment-variables"]

但这似乎并没有做任何事情。我究竟做错了什么?此应用需要知道它在哪个主机上运行 - 它可能在不同的主机上运行,​​并且需要根据主机的名称执行不同的操作。

感谢您的任何帮助。这是我第一次涉足服务器端 JavaScript。

根据要求,转译代码:

!function(n){function t(e){if(r[e])return r[e].exports;var o=r[e]={i:e,l:!1,exports:{}};return n[e].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};t.m=n,t.c=r,t.i=function(n){return n},t.d=function(n,r,e){t.o(n,r)||Object.defineProperty(n,r,{configurable:!1,enumerable:!0,get:e})},t.n=function(n){var r=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(r,"a",r),r},t.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},t.p="",t(t.s=1)}([function(n,t,r){"use strict";t.endianness=function(){return"LE"},t.hostname=function(){return"undefined"!=typeof location?location.hostname:""},t.loadavg=function(){return[]},t.uptime=function(){return 0},t.freemem=function(){return Number.MAX_VALUE},t.totalmem=function(){return Number.MAX_VALUE},t.cpus=function(){return[]},t.type=function(){return"Browser"},t.release=function(){return"undefined"!=typeof navigator?navigator.appVersion:""},t.networkInterfaces=t.getNetworkInterfaces=function(){return{}},t.arch=function(){return"javascript"},t.platform=function(){return"browser"},t.tmpdir=t.tmpDir=function(){return"/tmp"},t.EOL="\n"},function(n,t,r){"use strict";var e=r(0),o=e.hostname();console.log(e),console.log(o)}]);

这一切对我来说都非常可怕。自从 1995 年是 LiveScript 以来,我一直在编写 JavaScript,而 babel 的输出总是让我完全困惑,哈哈。

【问题讨论】:

  • But if I run it through babel, when I run it, I get nothing. No output at all. 转译后的代码是什么样的?
  • 已添加到问题中。抱歉遗漏了!
  • 呵呵。对不起。在那里剪切和粘贴延迟:)
  • 想知道它为什么会这样做 t.hostname = function() { return "undefined" != typeof location ? location.hostname : "" } - 显然,location 是未定义的 - 看起来它不仅仅是被转译!就好像它正在获取可以在 nodejs 中运行的代码并转换为可以在浏览器中运行的代码,也许吧? (将该行粘贴到浏览器控制台中证实了我的怀疑)
  • 请您自己添加答案,我可能已经“让您走上正轨”,但您自己找到了答案:p

标签: javascript node.js ecmascript-6 babeljs


【解决方案1】:

事实证明,是 webpack 配置导致了问题。 Jaromanda X 注意到转译的代码是针对浏览器而不是节点的,快速谷歌搜索提出了这个 SO 问题:Webpack babel config for both server and client javascript?

所以解决方案(在该问题的答案中)只是在 webpack 配置中添加一行:

target: 'node'

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2017-01-16
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多