使导出默认使用Babel,webpack和Node.js

我无法弄清楚为什么我的代码不起作用。

我正在构build一个ES6风格的类,并希望导出它能够在服务器端的其他地方使用它。 我把代码放到一个名为PlayerManager.jsserver文件夹中。

我把我的客户端代码放在src文件夹中。 而我的服务器代码在我的server文件夹和server文件夹外的server.js

这是目录结构:

 Root - dist - node_modules - public - server - src server.js webpack.base.js webpack.dist.js package.json .babelrc 

PlayerManager.js文件:

 class PlayerManager { constructor() { if (! PlayerManager.instance) { this.playerList = {}; this.bulletList = {}; this.initPack = {player: [], bullet: []}; this.removePack = {player: [], bullet: []}; PlayerManager.instance = this; } return PlayerManager.instance; } resetData() { this.initPack.player = []; this.initPack.bullet = []; this.removePack.player = []; this.removePack.bullet = []; } } const instance = new PlayerManager(); Object.freeze(instance); export default instance; 

但是,当我使用运行node server.js npm run dev ,会引发错误

 export default instance; ^^^^^^ SyntaxError: Unexpected token export at Object.exports.runInThisContext (vm.js:53:16) 

这里是webpack中的babelconfiguration:

 const path = require('path'); var CopyWebpackPlugin = require('copy-webpack-plugin'); module.exports = { entry: { main: './src/main' }, output: { path: path.join(__dirname, 'dist'), filename: '[name].bundle.js' }, plugins: [ new CopyWebpackPlugin([ { from: 'public/img', to: 'static' }, { from: 'public' } ]) ], module: { loaders: [ { test: /\.js$/, loader: 'babel', //include: path.join(__dirname, 'src') exclude: [ path.resolve(__dirname, "node_modules"), ], }, { test: /\.(png|jpg)$/, loader: 'url-loader?limit=90000' } ] }, resolve: { extensions: ['', '.js'] } }; 

.babelrc

 { "presets": [ "es2015" ], "sourceRoot": "./src" } 

在我的package.json文件中:

 "scripts": { "build": "npm run lint && npm run release", "lint": "./node_modules/.bin/eslint ./src/**/*.js", "dev": "node server.js", "release": "NODE_ENV=production webpack --config ./webpack.dist.js --progress", "test": "./test/*.test.js --compilers js:babel-core/register --recursive --reporter spec" }, 

Webpack是用于生成在客户端(在浏览器中)运行的软件包的打包程序,它不知道或关心服务器上的代码。 (除非你正在做普遍的应用程序的东西。)

你也会注意到,你的npm dev脚本只是要求节点加载server.js文件,在你的Webpackconfiguration文件中(正确地)没有提到任何地方。

你正在寻找babel-register

你可以使用Babel的方法之一是通过require钩子。 require hook将自己绑定到节点的require,并自动编译文件。

创build一个首先需要babel-register的“入口”文件,然后需要你的server.js文件:

 // server-entry.js require('babel-register') require('./server.js') 

现在将你的npm dev脚本改为node server-entry.js

______

另外:有必要创build一个入口文件,因为babel-register不能传输它被调用的文件。 例如,这会失败:

 // server.js require('babel-register') export default function () {}