【问题标题】:Issue with export node.js导出 node.js 的问题
【发布时间】:2020-04-15 09:50:04
【问题描述】:

我正在尝试将变量从一个 js 文件导入到 node.js 环境中的另一个。以下是仅包含重要部分的文件 -

file1.js

var socket = io.connect();
export default socket;

file2.js

import socket from "./chat.js";

我的 file1.js 显示错误,即 Uncaught SyntaxError: Unexpected token 'export' 。我搜索了网络,原因是我试图在节点 js 环境中使用 ES6 导入/导出语法。所以我使用 esm 包运行了我的 server.js 文件。

node -r esm app.js

app.js 文件 -

const express = require('express');
const app = express()

app.get('/', function (req, res) {
  res.sendFile(__dirname+'/index.html')
})

app.use(express.static(__dirname))

app.listen(3000, () => console.log('Example app listening on port 3000!'))

这也不起作用,返回 unexpected token export 的相同错误。谁能帮帮我?

注意:- 我的 app.js 文件是一个简单的 express 文件,它使用 file1.js 对 HTML 页面有一个 get 请求。

【问题讨论】:

  • 如果您使用节点语法,则需要使用module.exports = {socket} 而不是export default
  • 你需要 babel 包来编译你的代码。然后导入导出将起作用。
  • @DorianB,我尝试使用 module.exports 但它抛出错误“未捕获的 ReferenceError:模块未定义。”
  • @QubaishBhatti 尝试使用 bable 但后来发现这篇文章 timonweb.com/tutorials/…
  • 天哪!和@DorianB一起去,然后做var socket = require('path_of_file')

标签: javascript node.js ecmascript-6


【解决方案1】:

如果您不想使用 ESM 模块语法,此代码将有效:

file1.js:

const socket = { test: 1 }
module.exports = socket

file2.js:

const socket = require('./file1')
console.log(socket)

运行node file2.js 将记录{ test: 1 }。 它使用节点模块语法而不是 ESM 语法,但它可以工作。

【讨论】:

  • 用两个 javascript 文件尝试了你的代码,它可以工作。但是将 file2.js 放在 HTML 页面中,它不会工作。这给出了一个 Uncaught ReferenceError: require is not defined 错误。我认为这是因为,require 不是客户端,仅适用于我的 app.js 的服务器端代码。
  • 是的 require 是 Node 独有的,在浏览器中不起作用。要使用导入客户端,您必须使用 webpack 或其他模块捆绑器。
  • 好的。我从来不用像导入/导出这样的微小功能而苦苦挣扎。我使用过的所有其他语言都非常简单。
  • JavaScript 模块非常复杂,存在许多解决方案(作为模块捆绑器)来修补该语言中缺少的功能。
【解决方案2】:

使用可以使用来自ÀLaMode 转译器的alanode 二进制文件(0 依赖项,不像 Babel 的 ~250),它执行基于正则表达式的从导入到 Node 中的模块。

npm i alanode --save-dev
yarn add alanode

然后在 package.json 中添加一个脚本:

{
  "name": "your-package",
  "scripts": {
    "test": "...etc",
    "alanode": "alanode"
  }
}

之后你就可以用它来运行你的脚本了:

$> npm run alanode -- app

或者如果使用 yarn 只是以下,你不需要在 package.json 中添加脚本:

$> yarn alanode app

如果您想在没有alanode 代理的情况下运行标准节点,您需要创建一个需要alamode 的文件,例如src/index.js

require('alamode')()
require('./app')

它被称为 require 钩子:每个 JS 文件将首先针对转译函数运行,以将这些导入更新为 require 语句并导出到 module.export 分配。这样,即使您使用普通 Node.js 运行,导入也会自动转译。然后你也可以构建你的源代码:

$> yarn alamode src -o build -s

其中-o 是构建文件夹,-s 表示没有您不需要的源映射,因为输出与原始映射非常相似,只是导入/导出发生了变化。

yarnnpm 的区别在于,当本地依赖的二进制安装时(它在package.json 中有bin),yarn 可以用于只运行yarn <name-of-bin> 以获得它会生成,但 npm 不能,因此您需要为它创建一个脚本,然后添加 -- 以便传递参数。

请注意,如果您的模板字符串使用带有// 的协议,ÀLaMode 可能会中断,例如,

const URL = `ws://localhost`
export default socket

const something else = `test`

所以你需要像

这样轻轻地调整代码
const URL = `ws:/` + `/localhost

因为 2 个连续的斜杠会触发评论替换以防止误报。有点不方便。

【讨论】:

  • 在推广您自己的产品时,请务必披露隶属关系
猜你喜欢
  • 2013-10-28
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 2013-03-10
  • 2013-05-19
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多