【发布时间】: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