web-dev-qa-db-ja.com

Node-別のパッケージのモジュールからクラスをインポートします

Node.jsを使用してアプリを作成しています。具体的には、Node v10.3.0を使用しています。このアプリは./my-module-console/index.jsにあるディレクトリにあります。このアプリには./my-module-console/package.jsonにあるpackage.jsonファイルがあります。このアプリは./my-module/items/で定義されたクラスを参照します。my-moduleは独自のパッケージを表すことに注意してください。このパッケージは./my-module/package.jsonで定義されています。index.jsのコードは次のようになります:

'use strict';

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

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

entry();

これを実行しようとすると、次のエラーが発生します。

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

インポートステートメントの何が問題になっていますか?それは私には正しいようです。私は何かを誤解していますか?

item.js

class Item {
    constructor() {}

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

module.exports = Item;

ありがとう!

5
Some User

@jsur ESモジュールで述べたように、モジュールはまだ実験段階です。ただし、それらを使用する場合は、--experimental-modulesを追加する必要があります。それでもESモジュールを使用したい場合は、rename .js to .mjsとitem.jsを使用する必要があります。これはcommonJSスタイルですが、ESモジュールに変更する必要があります+その他の小さな修正。また、「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を実行してください。

4

_import { Item } from '../my-module/items/item.js';_は、JavaScriptモジュールからエクスポートをインポートするためのES6構文です。 Nodeは現在、追加のフラグなしではこれをサポートしていないため、代わりにrequireを使用する必要があります:

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

この方法では、クラスItemを_item.js_にエクスポートする必要があります。

また、_index.js_で関数を使用するには、エクスポートするクラスのインスタンスを作成する必要があることにも注意してください。

0
jsur

インポートは現在実験段階です。ドキュメントごと

--experimental-modulesフラグを使用して、ESMモジュールをロードする機能を有効にすることができます。

これを設定すると、.mjsで終わるファイルをESモジュールとしてロードできるようになります。

node --experimental-modules my-app.mjs

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

0
Waqas Noor

babelコンパイラを使用してES6コードをコンパイルして実行しない限り、Importはまだサポートされていません。

experimental-modulesを使用するのは、実験、つまり開発環境用です。 .mjsに名前を変更することは、最終的には変更されるため、良い考えではありません。

Babel jsを使用する場合:ES6でコードを記述し、コンパイルして実行します。

Babelの概要

オプションで、

問題をすばやく解決して先に進む方法は次のとおりです。

const item = require('../my-module/items/item');
  • Babelの詳細については こちら をご覧ください。
  • インポートについて こちら
0
Harshal

最初:

class Item {
    constructor() {}

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

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

2番目:

'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();
0
Denis Rohlinsky