Saya don't memahami apa yang salah. Node v5.6.0 NPM v3.10.6
Kode:
function (exports, require, module, __filename, __dirname) {
import express from 'express'
};
Kesalahan:
SyntaxError: Unexpected token import
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:387:25)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:140:18)
at node.js:1001:3
Update 3: Sejak Node 13, anda dapat menggunakan baik .mjs ekstensi, atau mengatur "type": "modul" dalam paket anda.json. Anda don't perlu menggunakan --eksperimental-modul
bendera.
Update 2: Sejak Node 12, anda dapat menggunakan salah .mjs
ekstensi, atau mengatur "type": "modul"
di dalam paket anda.json. Dan anda butuhkan untuk menjalankan node dengan --eksperimental-modul
bendera.
Update: Dalam Node 9, hal ini memungkinkan belakang bendera, dan menggunakan .mjs
ekstensi.
node --experimental-modules my-app.mjs
Sementara impor
ini memang bagian dari ES6, sayangnya belum didukung di NodeJS secara default, dan hanya baru-baru ini mendarat dukungan dalam browser.
Lihat browser compat tabel di MDN dan Node ini masalah.
Dari James M Snell's Update pada ES6 Modul di Node.js (februari 2017):
Bekerja di kemajuan tapi itu akan mengambil beberapa waktu, saat ini Kami sedang mencari di sekitar tahun setidaknya.
Sampai dukungan muncul native, anda'll harus terus menggunakan klasik memerlukan
pernyataan:
const express = require("express");
Jika anda benar-benar ingin menggunakan baru ES6/7 fitur di NodeJS, anda dapat compile menggunakan Babel. Di sini's contoh server.
Sayangnya, Node.js doesn't dukungan ES6's impor
belum.
Untuk mencapai apa yang anda're berusaha untuk melakukan (impor Express modul), kode ini harus cukup
var express = require("express");
Juga, pastikan anda memiliki Express diinstal dengan menjalankan
$ npm install express
Lihat Node.js Docs untuk informasi lebih lanjut tentang belajar Node.js.
Kesalahan: SyntaxError: Unexpected token impor atau SyntaxError: Unexpected token ekspor
Solusi: Mengubah semua impor anda sebagai contoh
const express = require('express');
const webpack = require('webpack');
const path = require('path');
const config = require('../webpack.config.dev');
const open = require('open');
Dan juga mengubah ekspor default = foo;
untuk modul.ekspor = foo;
Seperti yang disebutkan dalam jawaban yang lain Node JS saat ini doesn't dukungan ES6 impor.
(Sampai sekarang, baca SUNTING 2)
Mengaktifkan ES6 impor di node js menyediakan solusi untuk masalah ini. Saya telah mencoba ini dan itu bekerja untuk saya.
Jalankan perintah:
npm install babel-register babel-preset-env --save-dev
Sekarang anda perlu untuk membuat file baru (config.js) dan tambahkan kode berikut ke dalamnya.
require('babel-register')({
presets: [ 'env' ]
})
// Import the rest of our application.
module.exports = require('./your_server_file.js')
Sekarang anda dapat menulis impor pernyataan tanpa mendapatkan apapun kesalahan.
Semoga ini bisa membantu.
EDIT:
Anda perlu menjalankan file baru yang anda buat dengan kode di atas. Dalam kasus saya itu config.js
. Jadi saya harus menjalankan:
node config.js
EDIT 2:
Sementara bereksperimen, saya menemukan satu solusi mudah untuk masalah ini.
Membuat .babelrc
file di root proyek anda.
Tambahkan berikut (dan lainnya babel preset yang anda butuhkan, dapat ditambahkan dalam file ini):
{
"presets": ["env"]
}
Install babel-preset-env
dengan menggunakan perintah npm install babel-preset-env-simpan
, dan kemudian menginstal babel-cli
dengan menggunakan perintah npm install babel-cli -g-simpan
Sekarang, pergi ke folder di mana anda server atau file indeks yang ada dan dijalankan menggunakan: babel-node fileName.js
Atau anda hanya dapat dijalankan menggunakan npm mulai
dengan menambahkan code berikut ke dalam paket
.jsonfile
:
"scripts": {
"start": "babel-node src/index.js"
}
Dalam hal bahwa anda masih dapat't gunakan "impor" di sini adalah bagaimana saya menanganinya: Hanya menerjemahkannya ke sebuah node yang cocok bagi membutuhkan. Contoh:
import { parse } from 'node-html-parser';
Adalah sama seperti:
const parse = require('node-html-parser').parse;
jika anda dapat menggunakan 'babel', cobalah untuk menambahkan membangun script dalam paket.json(--preset=es2015) seperti di bawah ini. itu membuat untuk precompile impor kode untuk es2015
"build": "babel server --out-dir build --presets=es2015 && webpack"
babel 7 proposal anda dapat menambahkan dependensi dev
npm i -D @babel/core @babel/preset-env @babel/register
dan menambahkan .babelrc di root
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "current"
}
}
]
]
}
dan menambah .js file
require("@babel/register")
atau jika anda menjalankannya di cli, anda bisa menggunakan memerlukan hook sebagai -r @babel/mendaftar, ex.
$node -r @babel/register executeMyFileWithESModules.js
Sebagai Node.js v12 (dan ini mungkin cukup stabil, tapi masih ditandai "eksperimental"), anda memiliki beberapa pilihan untuk menggunakan ESM (ECMAScript Modules) di Node.js (untuk file ini, ada's cara yang ketiga untuk evaling string), di sini's apa dokumentasi mengatakan:
--eksperimental-modul
bendera dapat digunakan untuk mengaktifkan dukungan untuk ECMAScript modul (modul ES).Setelah diaktifkan, Node.js akan memperlakukan sebagai berikut ES modul ketika lulus untuk
node
sebagai input awal, atau ketika dirujuk olehimpor
pernyataan dalam ES kode modul:
File berakhiran
.mjs
.File berakhiran
.js
, atau extensionless file, ketika terdekat orang tuapaket.json
file yang berisi tingkat atas lapangan"type"
dengan nilai"modul"
.String yang dilewatkan sebagai argumen ke
--eval
atau--cetak
, atau disalurkan kenode
melaluiSTDIN
, dengan bendera--input type=modul
.Node.js akan memperlakukan sebagai CommonJS semua bentuk-bentuk lain dari input, seperti
.js
file di mana terdekat orang tuapaket.json
file yang berisi tingkat atas"type"
lapangan, atau input string tanpa bendera--input-jenis
. Perilaku ini adalah untuk menjaga kompatibilitas. Namun, sekarang yang Node.js mendukung kedua CommonJS dan ES modul, yang terbaik adalah untuk menjadi eksplisit bila memungkinkan. Node.js akan memperlakukan sebagai berikut CommonJS ketika melewati kenode
sebagai input awal, atau ketika dirujuk olehimpor
pernyataan dalam ES kode modul:
File berakhiran
.cjs
.File berakhiran
.js
, atau extensionless file, ketika terdekat orang tuapaket.json
file yang berisi tingkat atas lapangan"type"
dengan nilai"commonjs"
.String yang dilewatkan sebagai argumen ke
--eval
atau--cetak
, atau disalurkan kenode
melaluiSTDIN
, dengan bendera--input type=commonjs
.
Ketika saya mulai dengan express selalu ingin solusi untuk menggunakan impor bukan memerlukan
const express = require("express"); // untuk impor express dari "express"
Banyak waktu pergi melalui baris ini:- Sayangnya, Node.js doesn't dukungan ES6's impor belum.
Sekarang untuk bantuan lain yang saya buat baru dua solusi di sini
Cemerlang sederhana, babel-kurang, bundle-kurang ECMAScript modul loader.
let's membuatnya bekerja
benang tambahkan esm / npm install esm
membuat start.js atau menggunakan namespace
memerlukan = require("esm")(modul/*, pilihan*/) // Import sisa aplikasi kita. modul.ekspor = require('./src/server.js') // di mana server.js adalah express server mulai file
Perubahan dalam paket.josn
melewati jalur start.js
``
"script": {
"mulai": "node awal.js",
"mulai:dev": "nodemon mulai.js",
},
"dependensi": {
Hal ini dapat membagi menjadi 2 bagian
a) Solusi 1 terima kasih untuk timonweb.com
b) Solusi 2
gunakan Babel 6 (versi babel-preset-tahap-3 ^6.0)
buat .babelrc
file di folder root anda
{ "preset": ["l", "tahap-3"] }
Menginstal babel-preset-tahap-3
benang tambahkan babel-cli babel-polyfill babel-preset-env bable-preset-tahap-3 nodemon --dev
Perubahan paket.json
``
"script": {
Mulai server anda
benang start / npm mulai
Oooh tidak kita membuat masalah baru
regeneratorRuntime.mark(fungsi _callee(email, password) {
^
ReferenceError: regeneratorRuntime tidak didefinisikan
Kesalahan ini hanya datang ketika anda menggunakan async/menanti dalam kode anda. Kemudian gunakan polyfill yang mencakup custom regenerator runtime dan core-js. tambahkan di atas `index.js`
impor "babel-polyfill"
``
Ini memungkinkan anda untuk menggunakan async/menantigunakan Babel 7
Perlu upto date setiap hal dalam proyek anda
mari kita mulai dengan babel 7
.babelrc
{ "preset": ["@babel/preset-env"] }
Beberapa perubahan dalam paket.json
``
"script": {
dan menggunakan `impor "@babel/polyfill"` pada titik awal
impor "@babel/polyfill"
impor express dari 'express'
const app = ekspres()//MENDAPATKAN permintaan
aplikasi.dapatkan('/', async (req, res) {
// menunggu operasi
res.mengirim('hello world')
})
aplikasi.mendengarkan(4000, () => console.log('🚀 Server mendengarkan pada port 400!'))
` Apakah anda berpikir mengapa
mulai:dev`
Serius. Itu adalah pertanyaan yang bagus jika anda baru. Setiap perubahan yang anda adalah babi hutan dengan start server setiap waktu
kemudian menggunakan benang mulai:dev
sebagai pengembangan server setiap perubahan, restart server secara otomatis untuk lebih lanjut tentang nodemon
I'm terkejut esm
tidak't telah disebutkan. Ini kecil, namun perkasa memungkinkan anda untuk menggunakan impor
atau memerlukan
.
* Menginstal esm dalam proyek anda**
$ npm install-simpan esm
Update Node Awal Script untuk menggunakan esm
node -r esm app.js
esm
hanya bekerja. Aku menyia-nyiakan banyak waktu dengan .mjs
dan --eksperimental-modul
hanya untuk mengetahui .mjs
file tidak dapat mengimpor file yang menggunakan memerlukan
atau modul.ekspor
. Ini adalah masalah besar, sedangkan esm
memungkinkan anda untuk mencampur dan mencocokkan dan itu hanya angka-angka keluar... esm
hanya bekerja.