Node.js 如何使节点JS中的服务器和客户端脚本都可以看到ES6类?
因此,在一个名为Node.js 如何使节点JS中的服务器和客户端脚本都可以看到ES6类?,node.js,ecmascript-6,Node.js,Ecmascript 6,因此,在一个名为shapes.js class Shape { constructor(x, y) { this.x = x; this.y = y } } class Cube extends Shape { constructor(x, y, t) { super(x, y); this.t = t; } } 如何在我的server.js或其他js文件中导入这两个文件?我知道Shape现在
shapes.js
class Shape {
constructor(x, y) {
this.x = x;
this.y = y
}
}
class Cube extends Shape {
constructor(x, y, t) {
super(x, y);
this.t = t;
}
}
如何在我的server.js
或其他js文件中导入这两个文件?我知道Shape
现在只不过是一个抽象类,但我想测试导入多个类的功能。我试过以下几种方法:
var shape = require('/shapes');
var Shape = shape.Shape, Cube = shape.Cube;
or
import {Shape, Cube} from 'shapes'
import {Shape, Cube} from '/shapes'
我还尝试将它们导出到文件末尾的shapes.js
中,如下所示:
module.exports = {Shape, Cube}
or
export {Shape, Cube}
我已经尝试了基础教程中提供的所有可能性,结果要么是一个错误,要么是一个没有错误的空白白屏。我真的被困在这一点上了,希望能得到一些帮助,谢谢你我鼓励你使用ES模块语法:
将{Shape,Cube}从“shapes”导入到
导出{Shape,Cube}
到
大多数浏览器都支持这一点。不幸的是!Node.js支持ES6,但不支持ESModule语法(或)
因此,您需要使用和传输代码
下面是用于配置babel的.babelrc文件:
{
"plugins": ["transform-es2015-modules-commonjs"]
}
如果在需要(导入)文件时使用转换,模块。导出
语法是导出代码的最佳方式。但是,导入它们的最佳方式因节点和浏览器而异
module.exports = {Shape, Cube}; // in file with classes defined
// below are different ways to import
const { Shape, Cube } = require('./shapes'); // Node
import { Shape, Cube } from './shapes'; // modern browsers
节点行有一个称为destructuring语句的语句。它只是防止您同时定义shape
和shape
/Cube
您在问题中说您尝试了module.exports
和require语句。我的猜测是,您要么a)没有同时尝试这两种方法,要么b)如果require语句中没有/
,程序将找不到您的文件
请注意,导出/导入关键字在节点中不起作用-它们仅在现代浏览器中起作用。正如其他答案所指出的那样,有一些方法可以让这些方法发挥作用。但是,我通常不建议在规模较小的项目中使用它们,特别是当您刚刚熟悉这些内容时。在我的上一个项目中,我将Typescript与node.js一起使用,它非常强大,因此我使用
名称空间
方式:
shapes.ts:
export namespace Shapes {
export class A {
constructor(x, y) {
this.x = x;
this.y = y
}
}
export class B {
constructor(x, y) {
this.x = x;
this.y = y
}
}
}
用法:
import Shapes from 'shapes'
let shapeA = new Shapes.A();
如果将
module.exports={Shape,Cube}
放入shapes.js
文件中,然后执行const{Shape,Cube}=require('./shapes')代码>在另一个文件中,那么我很确定它不会不起作用。或者,由于您将这个问题标记为node.js
,还有其他一些问题出现了-您是说在node.js的服务器端使用这些类,还是说在客户端(在浏览器中)使用它们?^事实上,我问这两个问题,因为在node.js的服务器上它是非常不同的。那里还不支持JavaScript模块,因此您必须在那里使用module.exports
和require
。在浏览器中,大多数现在都支持JavaScript模块,因此您可以使用export
和import
,如下所述:现在我拥有的是module.exports={Shape,Cube};//shapes.js
,const{Shape,Cube}=require('./shapes');//js
和从“/shapes”导入{Shape,Cube};//game.js
当我用node--experimental modules server.js运行节点服务器时
一切正常,但当我打开http://localhost:3000
有一个空白的白色屏幕,没有错误。在index.html
中,我指定了类型->
是否需要babeljs来修复此问题?模块。导出
语法不是导出代码的最佳方式。它仅用于导出CommonJS模块。现在的标准是将ES模块与export
syntax一起使用,您不必使用--experimental模块使您的服务器使用module.exports
。如果它仍然不工作,那么您还有其他错误。我建议尝试使用console.logs来确定它是否被导出和导入。@BenCooper就好像game.js
脚本根本无法识别一样。当我运行服务器时,当我转到http://localhost:${port}
。即使是与我导入的类无关的东西,例如设置背景色等,也不会起作用