节点-从另一个包中的模块导入类

时间:2018-06-25 18:35:57

标签: javascript node.js import

我正在使用Node.js编写应用程序。具体来说,我正在使用Node v10.3.0。这个应用程式位于./my-module-console/index.js的目录中。这个应用程式的{.1}}中有一个package.json文件。该应用引用了./my-module-console/package.json中定义的类。应当注意,./my-module/items/代表其自己的程序包。该包在my-module中定义。 index.js中的代码如下:

./my-module/package.json

当我尝试运行此命令时,出现以下错误:

'use strict';

import { Item } from '../my-module/items/item.js';

async function entry() {
  let item = await Item.FindById(1);
  console.log(item);
}

entry();

我的导入语句有什么问题?在我看来,这是正确的。我误会了吗?

item.js

import { Item } from '../my-module/items/item.js';
       ^
SyntaxError: Unexpected token {

谢谢!

5 个答案:

答案 0 :(得分:4)

如@jsur所述,ES模块仍处于试验阶段。但是,如果要使用它们,则必须添加--experimental-modules。如果仍要使用ES模块,则必须将.js重命名为.mjs ,同时还要将item.js(现在是commonJS样式)更改为ES Modules +其他小的修复方法。同样,您也不必真的使用'use strict',默认情况下它是严格的。所以最后看起来应该像这样:

index.mjs

import { Item } from '../my-module/items/item';

async function entry() {
  let item = await Item.FindById(1);
  console.log(item);
}

entry();

item.mjs

export class Item {
    constructor() {}

    static async FindById(id) {
      console.log('finding item by id: ' + id);
    }
}

因此,现在执行node --experimental-modules index.mjs,就可以了。

答案 1 :(得分:0)

import { Item } from '../my-module/items/item.js';是用于从Javascript模块导入导出的ES6语法。目前,Node在没有其他标志的情况下不支持此功能,因此您必须改为使用require

const item = require('../my-module/items/item');

这样,您将需要在Item中导出类item.js

还请注意,您必须创建要导出的类的实例,才能在index.js中使用其功能。

答案 2 :(得分:0)

第一:

class Item {
    constructor() {}

    async static FindById(id) {
      console.log('finding item by id: ' + id);
    }
};

module.exports.Item = Item; // change this line

第二:

'use strict';

// import { Item } from '../my-module/items/item.js'; // not sure if it work, it work in react, but in regular node.js can be wrong (look doc ES6)
const Item = require('../my-module/items/item.js');
var someitem = new Item();
async function entry() {
  let item = await someitem.FindById(1);
  console.log(item);
}
entry();

答案 3 :(得分:0)

导入目前处于实验阶段。 根据文档

  

--experimental-modules标志可用于启用以下功能:   加载ESM模块。

     

设置好之后,以.mjs结尾的文件将可以   作为ES模块加载。

     

node --experimental-modules my-app.mjs

https://nodejs.org/api/esm.html

答案 4 :(得分:0)

除非您使用 babel编译器编译ES6代码然后运行它,否则尚不支持

class myClass { public: myClass(bool& iBool) { t = thread(&myClass::myMethod,this,iBool); } ~myClass() { t.join(); } private: thread t; void myMethod(bool& iBool) { this_thread::sleep_for(chrono::seconds(1)); if(iBool) cout << "It's safe!" << endl; else cout << "It's NOT safe!!!" << endl; } }; void main() { bool passedBool = true; cout << "Passing true" << endl; myClass mmyClass(passedBool); cout << "Changing value for false" <<endl; passedBool = false; cout << "Expect \"It's NOT safe!!!\"" <<endl; }

使用实验模块用于实验即开发环境。重命名为.mjs并不是一个好主意,因为最终它将改变。

如果要使用babel js:在ES6中编写代码并编译并运行它。

Getting started with Babel

(可选)

以下是您快速解决问题并继续前进的方法:

Import
  • 了解有关Babel here的更多信息。
  • 关于导入here