【问题标题】:Getting Node to 'understand' ES6 import (Babel)让 Node “理解” ES6 导入 (Babel)
【发布时间】:2023-03-11 01:30:01
【问题描述】:

尝试运行我的 express 服务器,但它无法理解“import”关键字。我以为我已经安装了所有 Babel 依赖项,但显然没有……

命令:node server.js

控制台:SyntaxError: Unexpected token import


.babelrc - 我还需要添加什么吗?

{
  "presets": ["react", "es2015"]
}

package.json

...

"dependencies": {
    "express": "^4.14.0",
    "react": "^15.3.2",
    "react-dom": "^15.3.2",
    "react-redux": "^4.4.5",
    "redux": "^3.6.0"
  },
  "devDependencies": {
    "babel-cli": "^6.18.0",
    "babel-core": "^6.18.2",
    "babel-loader": "^6.2.7",
    "babel-plugin-transform-react-jsx": "^6.8.0",
    "babel-preset-es2015": "^6.18.0",
    "babel-preset-react": "^6.16.0",
    "webpack": "^1.13.3"
  }

...

server.js

import path from 'path'
import Express from 'express'
import React from 'react'
import { createStore } from 'redux'
import { Provider } from 'react-redux'
import counterApp from './reducers'
import App from './containers/App'

const app = Express()
const port = 3000

// This is fired every time the server side receives a request
app.use(handleRender)

import { renderToString } from 'react-dom/server'

function handleRender(req, res) {
  // Create a new Redux store instance
  const store = createStore(counterApp)

  // Render the component to a string
  const html = renderToString(
    <Provider store={store}>
      <App />
    </Provider>
  )

  // Grab the initial state from our Redux store
  const preloadedState = store.getState()

  // Send the rendered page back to the client
  res.send(renderFullPage(html, preloadedState))
}

function renderFullPage(html, preloadedState) {
  return `
    <!doctype html>
    <html>
      <head>
        <title>Redux Universal Example</title>
      </head>
      <body>
        <div id="root">${html}</div>
        <script>
          window.__PRELOADED_STATE__ = ${JSON.stringify(preloadedState)}
        </script>
        <script src="/static/bundle.js"></script>
      </body>
    </html>
    `
}

app.listen(port)

更新

现在已完成以下操作:

命令:npm install babel-plugin-transform-es2015-modules-commonjs

.babelrc

{
  "presets": ["react", "es2015"],
  "plugins": ["transform-es2015-modules-commonjs"]
}

命令:babel server.js --out-file server-compiled.js

命令:node server-compiled.js

--> server.js 的编译似乎成功了。我仍然收到相同的错误消息,但这次是文件./containers/App.ks,它还包含一个 ES6 模块语句。

我已经在我的 webpack.config.js 文件中包含了所有 babel 插件和预设,所以我会假设我的捆绑包处理了所有其他文件?

server-compiled.js

'use strict';

var path = require('path');
var Express = require('express');
var React = require('react');
var redux = require('redux').createStore;
var Provider = require('react-redux').Provider;
var counterApp = require('./reducers');
var App = require('./containers/App');

var app = Express();
var port = 3000;

// This is fired every time the server side receives a request
app.use(handleRender);

var renderToString = require('react-dom/server').renderToString;

function handleRender(req, res) {
  // Create a new Redux store instance
  var store = createStore(counterApp);

  // Render the component to a string
  var html = renderToString('\n    <Provider store={store}>\n      <App />\n    </Provider>\n    ');

  // Grab the initial state from our Redux store
  var preloadedState = store.getState();

  // Send the rendered page back to the client
  res.send(renderFullPage(html, preloadedState));
}

function renderFullPage(html, preloadedState) {
  return ' <!doctype html>\n    <html>\n      <head>\n        <title>Redux Universal Example</title>\n      </head>\n      <body>\n        <div id="root">' + html + '</div>\n        <script>\n          window.__PRELOADED_STATE__ = ' + JSON.stringify(preloadedState) + '\n        </script>\n        <script src="/static/bundle.js"></script>\n      </body>\n    </html>\n    ';
}

app.listen(port);

webpack.config.js

module.exports = {
    entry: "./client.js",
    output: {
        path: __dirname,
        filename: "bundle.js"
    },
    module: {
        loaders: [
            { test: /\.css$/, loader: "style!css" },
            {
               test: /\.js$/,
               exclude: /(node_modules|bower_components)/,
               loader: 'babel', // 'babel-loader' is also a valid name to reference
               query: {
                  presets: ['es2015', 'react'],
                  plugins: ['transform-es2015-modules-commonjs']
               }
            }
        ]

client.js(入口文件)

import React from 'react'
import { render } from 'react-dom'
import { createStore } from 'redux'
import { Provider } from 'react-redux'
import App from './containers/App'
import counterApp from './reducers'

// Grab the state from a global injected into server-generated HTML
const preloadedState = window.__PRELOADED_STATE__

// Create Redux store with initial state
const store = createStore(counterApp, preloadedState)

render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
)

containers/App.js - 此文件仍会在控制台中显示错误

import React, { Component } from 'react'

export default class App extends Component {
   render() {
      return (
         <div>App Component Here</div>
      )
   }
}

【问题讨论】:

  • 那你是说只能使用const express = require('express'),例如?
  • 你可以简单地将“transform-es2015-modules-commonjs”添加到你的.babelrc。不包含的原因是因为 es6 的模块是 es6 定义的,但是它们的实现还在等待中。
  • 请看更新...

标签: node.js express import ecmascript-6 babeljs


【解决方案1】:

我遇到了这个问题,并通过使用 babel-node 而不是节点解决了。我正在使用 Webstorm,通过查看 node_packages 来更改节点解释器很容易(或者如果您在 Windows 中的 ~\AppData\Roaming\npm\babel-node.cmd~/.node/bin/babel-node *nix/osx 全局安装它。顺便说一下,在 Windows 中很重要使用*.cmd

【讨论】:

  • 请注意,babel-node 仅用于开发,而非生产。
【解决方案2】:

仅仅安装 Babel 并创建一个.babelrc 文件是不够的。您必须实际编译您的文件并使用node 运行编译后的文件。

您可以使用以下命令编译您的文件:

babel server.js --out-file server-compiled.js

然后运行它:

node server-compiled.js

要编译整个目录,请使用以下命令:

babel src --out-dir lib

src 替换为您保存源文件的目录的名称,将lib 替换为您希望输出编译文件的目录的名称。


另见Babel CLI docs

【讨论】:

  • 试过了,它仍然显示SyntaxError: Unexpected token import,但这次出于某种原因在import React... 行上。
  • @Paulos3000 编译后的文件是什么样子的?
  • @Paulos3000 你解决了吗?我也遇到了同样的问题
  • @intercoder 如果这个答案对你没有帮助,你应该问一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 2015-09-13
  • 2019-04-07
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 2017-12-30
相关资源
最近更新 更多