web-dev-qa-db-ja.com

ノードでes6インポートを使用する方法

私はnodeでes6インポートの問題を解決しようとしていて、この例で提供されている構文を使用しようとしています:

チートシートのリンク: https://hackernoon.com/import-export-default-require-commandjs-javascript-nodejs-es6-vs-cheatsheet-different-tutorial-example-5a321738b50f

私はサポート表を見ています: http://node.green/ 、しかし、どのバージョンが新しいimport文をサポートしているかを見つけることができませんでした(私はテキストimport/requireを探してみました)。また、チートシートは.jsファイルを参照しているので、.jsファイルでも動作するはずです。

コードを実行すると(チートシートの最初の例から抜粋):

import { square, diag } from 'lib';

SyntaxError:予期しないトークンのインポートです。

Libへの参照インポートしようとしています:

//------ lib.js ------
export const sqrt = Math.sqrt;
export function square(x) {
    return x * x;
}
export function diag(x, y) {
    return sqrt(square(x) + square(y));
}

足りないものは何ですか?また、どのようにしてノードにインポートステートメントを認識させることができますか?

140
Jonathan002

Node.jsはES6サポートのための実験的サポートを含みました。ここについての詳細を読んでください: https://nodejs.org/api/esm.html

TLDR。 拡張子が.mjsのES6モジュールでファイルを保存し、次のように実行します。

node --experimental-modules my-app.mjs

Node.jsはES6モジュールをサポートしません。 このJamesによるブログ はその理由を説明しています。 Babel を使ってES6モジュールの構文を使うこともできます。

109
tbking

約3時間無駄にしました。

私はちょうどjsファイルでimportexportを使いたかったのです。

誰もができないと言います。しかし、2018年5月の時点で、babelなどのようなモジュールなしで、上記のプレーンなnode.jsで使用することは可能です。

これをする簡単な方法はここにあります。

以下のファイルを作成し、実行して自分で出力を確認してください。

また、以下のExplanationを見ることを忘れないでください。

myfile.mjs

function myFunc() {
    console.log("Hello from myFunc")
}

export default myFunc;

index.mjs

import myFunc from "./myfile"  // this is our myfile.mjs

myFunc();

走る

node  --experimental-modules  index.mjs

出力

(node:12020) ExperimentalWarning: The ESM module loader is experimental.

Hello from myFunc

説明:

  1. 実験的なモジュールなので、.jsファイルは.mjsファイルと呼ばれます。
  2. 実行中に--experimental-modulesnode index.mjsを追加します。
  3. 出力に実験的モジュールを使用して実行している間、「(node:12020)ExperimentalWarning:ESMモジュールローダーは実験的です。」と表示されます。
  4. 私はノードjsの現在のリリースを持っているので、もし私がnode --versionを実行すれば、それは私に "v10.3.0"を与えます、LTE/stable /推奨されたバージョンは8.11.2 LTSですが。
  5. 将来的には、Experimentalの代わりに安定する機能として、.mjsの代わりに.jsを使用することができます。
  6. 実験的な機能の詳細については、 https://nodejs.org/api/esm.html を参照してください。

お役に立てば幸いです。

74

esm と呼ばれるnpmパッケージを使うこともできます。これでnodeでES6モジュールを使うことができます。設定は不要です。 esmを使用すると、JSファイルでエクスポート/インポートを使用できるようになります。

端末で次のコマンドを実行してください。

yarn add esm 

または

npm install esm

その後、nodeを使ってサーバを起動するときにこのパッケージを要求する必要があります。たとえば、ノードサーバーがindex.jsファイルを実行している場合は、次のコマンドを使用します。

node -r esm index.js

このようにpackage.jsonファイルに追加することもできます。

{
  "name": "My-app",
  "version": "1.0.0",
  "description": "Some Hack",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node -r esm index.js"
  },

}

その後、端末からこのコマンドを実行してノードサーバーを起動します。

npm start

チェック このリンク 詳細については/

49
Seunope

サーバー側でモジュールシステムを使用している場合は、Babelを使用する必要はまったくありません。 NodeJSでモジュールを使用するには、次のことを確認してください。

  1. --experimental-modules フラグをサポートするバージョンのnodeを使用してください
  2. .js ファイルの名前は .mjs に変更する必要があります。

それでおしまい。

ただし、これは大きな問題ですが、純粋なES6コードがNodeJS(9.5.0の執筆時点)のような環境で実行される場合でも、テストのためだけにトランスピリングの狂気が残るでしょう。また、Ecmaは、Javascriptのリリースサイクルがより速くなり、新しい機能がより定期的に提供されるようになっていると述べていることにも留意してください。 NodeJSのような単一の環境ではこれは問題になりませんが、ブラウザ環境では少し異なる提案です。明らかなことは、テストフレームワークが追いつくためにやるべきことがたくさんあるということです。あなたはまだフレームワークをテストするためにおそらく転置する必要があるでしょう。私はjestを使うことを勧めます。

また、フレームワークをバンドルすることに注意してください、あなたはそこで問題に遭遇するでしょう

17
Zardoz

esmを試すことができます。

ここにいくつかの紹介があります: https://www.npmjs.com/package/esm

13
Losses Don

Jonathan002 の元の質問に戻る

「...新しいES6インポートステートメントをサポートしているバージョンは?」

Axel Rauschmayer博士による記事 に基づいて、Node.js 10でデフォルトで(実験的なコマンドラインフラグなしで)サポートされる計画があります。 x LTSnode.jsのリリース計画 によると、2018年3月29日のように、2018年4月以降に利用可能になる可能性が高いそのLTSは2018年10月に開始されます。

7
codeful.element

https://www.npmjs.com/package/babel-register

// this is to allow ES6 export syntax
// to be properly read and processed by node.js application
require('babel-register')({
  presets: [
    'env',
  ],
});

// after that any line you add below that has typical es6 export syntax 
// will work just fine

const utils = require('../../utils.js');
const availableMixins = require('../../../src/lib/mixins/index.js');

下記はmixins/index.jsの定義です。

export { default as FormValidationMixin } from './form-validation'; // eslint-disable-line import/prefer-default-export

これは私のnode.js CLIアプリの中ではうまくいきました。

6
DmitrySemenov
  "devDependencies": {
    "@babel/core": "^7.2.0",
    "@babel/preset-env": "^7.2.0",
    "@babel/register": "^7.0.0"
  }

.babelrc

{
  "presets": ["@babel/preset-env"]
}

エントリポイントnode.jsアプリ

require("@babel/register")({})

// Import the rest of our application.
module.exports = require('./index.js')

Node.JSでES6のインポートを有効にする方法のリンク https://timonweb.com/posts/how-to-enable-es6-imports-in-nodejs/

4
zloctb

これがあなたのケースでうまくいくかどうかはわかりませんが、これを使って高速サーバーを実行しています。

nodemon --inspect ./index.js --exec babel-node --presets es2015,stage-2

ノードバージョン8のみを使用していますが、これにより、スプレッド演算子をインポートして使用することができます。

Babel-cli、babel-preset-es2015、babel-preset-stage-2をインストールする必要があります。

3
unflores

Node v12.2.0を使うと、私はこのように全ての標準モジュールをインポートすることができます。

import * as Http from 'http'
import * as Fs from 'fs'
import * as Path from 'path'
import * as Readline from 'readline'
import * as Os from 'os'

私が前にしたことと対比して:

const
  Http = require('http')
  ,Fs = require('fs')
  ,Path = require('path')
  ,Readline = require('readline')
  ,Os = require('os')

ECMAScriptモジュールであるすべてのモジュールは、package.jsonファイルにこのフィールドがある限り、.mjs拡張子を使用せずにインポートできます。

"type": "module"

だからあなたが作っているモジュールと同じフォルダにそのようなpackage.jsonファイルを置くことを確認してください。

そしてECMAScriptモジュールサポートで更新されていないモジュールをインポートするためにあなたはこのようにすることができます:

// Implement the old require function
import { createRequire } from 'module'
const require = createRequire(import.meta.url)

// Now you can require whatever
const
  WebSocket = require('ws')
  ,Mime = require('mime-types')
  ,Chokidar = require('chokidar')

そしてもちろん、これがモジュールのインポートを使って実際にスクリプトを実行するのに必要であることを忘れないでください:

node --experimental-modules my-script-that-use-import.js

そして親フォルダは、インポート構文について文句を言わないためにそのスクリプトのためにこのpackage.jsonファイルを必要とします:

{
  "type": "module"
}

使用したいモジュールがimport構文を使用したインポートをサポートするように更新されていない場合は、requireを使用する以外に選択肢はありません(ただし、上記の解決策では問題ありません)。

ECMAScriptモジュールを有効にするために.mjsエクステンションを使うこと(受け入れられた答えで示唆されるように)は動作します、しかしNode.js v12では、あなたはpackage.jsonでグローバルにこの機能を有効にすることもできます。

公式ドキュメントの状態

最も近い親package.jsonに "type": "module"が含まれている場合、.jsおよび拡張子なしファイルのimportステートメントはESモジュールとして扱われます。

{
  "type": "module",
  "main": "./src/index.js"
}

(もちろん、アプリを起動するときにはまだ--experimental-modulesフラグを指定する必要があります)。

1
B12Toaster