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}
。即使是与我导入的类无关的东西,例如设置背景色等,也不会起作用