私はnodeでes6インポートの問題を解決しようとしていて、この例で提供されている構文を使用しようとしています:
私はサポート表を見ています: 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));
}
足りないものは何ですか?また、どのようにしてノードにインポートステートメントを認識させることができますか?
Node.jsはES6サポートのための実験的サポートを含みました。ここについての詳細を読んでください: https://nodejs.org/api/esm.html 。
TLDR。 拡張子が.mjs
のES6モジュールでファイルを保存し、次のように実行します。
node --experimental-modules my-app.mjs
Node.jsはES6モジュールをサポートしません。 このJamesによるブログ はその理由を説明しています。 Babel を使ってES6モジュールの構文を使うこともできます。
約3時間無駄にしました。
私はちょうどjsファイルでimport
とexport
を使いたかったのです。
誰もができないと言います。しかし、2018年5月の時点で、babelなどのようなモジュールなしで、上記のプレーンなnode.jsで使用することは可能です。
これをする簡単な方法はここにあります。
以下のファイルを作成し、実行して自分で出力を確認してください。
また、以下のExplanation
を見ることを忘れないでください。
function myFunc() {
console.log("Hello from myFunc")
}
export default myFunc;
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
説明:
--experimental-modules
にnode index.mjs
を追加します。node --version
を実行すれば、それは私に "v10.3.0"を与えます、LTE/stable /推奨されたバージョンは8.11.2 LTSですが。お役に立てば幸いです。
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
チェック このリンク 詳細については/
サーバー側でモジュールシステムを使用している場合は、Babelを使用する必要はまったくありません。 NodeJSでモジュールを使用するには、次のことを確認してください。
それでおしまい。
ただし、これは大きな問題ですが、純粋なES6コードがNodeJS(9.5.0の執筆時点)のような環境で実行される場合でも、テストのためだけにトランスピリングの狂気が残るでしょう。また、Ecmaは、Javascriptのリリースサイクルがより速くなり、新しい機能がより定期的に提供されるようになっていると述べていることにも留意してください。 NodeJSのような単一の環境ではこれは問題になりませんが、ブラウザ環境では少し異なる提案です。明らかなことは、テストフレームワークが追いつくためにやるべきことがたくさんあるということです。あなたはまだフレームワークをテストするためにおそらく転置する必要があるでしょう。私はjestを使うことを勧めます。
また、フレームワークをバンドルすることに注意してください、あなたはそこで問題に遭遇するでしょう
esm
を試すことができます。
ここにいくつかの紹介があります: https://www.npmjs.com/package/esm
Jonathan002 の元の質問に戻る
「...新しいES6インポートステートメントをサポートしているバージョンは?」
Axel Rauschmayer博士による記事 に基づいて、Node.js 10でデフォルトで(実験的なコマンドラインフラグなしで)サポートされる計画があります。 x LTSnode.jsのリリース計画 によると、2018年3月29日のように、2018年4月以降に利用可能になる可能性が高い、そのLTSは2018年10月に開始されます。
解
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');
export { default as FormValidationMixin } from './form-validation'; // eslint-disable-line import/prefer-default-export
これは私のnode.js CLIアプリの中ではうまくいきました。
"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/
これがあなたのケースでうまくいくかどうかはわかりませんが、これを使って高速サーバーを実行しています。
nodemon --inspect ./index.js --exec babel-node --presets es2015,stage-2
ノードバージョン8のみを使用していますが、これにより、スプレッド演算子をインポートして使用することができます。
Babel-cli、babel-preset-es2015、babel-preset-stage-2をインストールする必要があります。
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
フラグを指定する必要があります)。