繁体   English   中英

如何使用Babel转换Node CLI应用

[英]How to transpile node cli app using babel

我正在使用node编写mt first cli应用程序,并且使用babel转换代码时遇到一些问题。 基本上,应用程序应启动一个执行ssr响应的快速服务器(类似于下一个)。 在此过程中的某个地方,我使用jsx语法来呈现react组件,因此我需要使用babel来转换我的代码。 我对如何使用babel cli或webpack做到这一点很熟悉,但是,我仍然面临在cli app中实现它的问题。

在我的package.json文件中,我有:

  "bin": {
    "ssr": "./cli/ssr.js"
  },

和我的ssr.js文件:

    #!/usr/bin/env node

const server  = require('../server');
const routes = require('../../routes.js');
const createStore = require('redux').createStore;

const port = process.env.PORT || 3000;
const args = process.argv;

const defReducer = function(state={}, action){
    return state;
}
const configureStore = createStore(defReducer);

const instance = server(routes, configureStore, {}, {});

instance.listen(port, ()=>{
    console.log(`ssr server runs on localhost://${port}`);
});

而我的server.js文件只是一个普通的快递服务器:

const express = require('express');
const cors = require('cors');
const renderer = require('./renderer');


module.exports = (Routes, createStore=()=>null, renderOpts={}, routerContext={})=>{
    const app = express();
    app.use(express.static('public'));
    app.use(cors());
    const port = process.env.PORT || 3000;

    app.get('*.js', (req, res, next) => {
        req.url = req.url + '.gz';
        res.set('Content-Encoding', 'gzip');
        next();
    });

    app.all('*', (req, res) => {

        const store = createStore();
        const promises = matchRoutes(Routes, req.path).map(( { route } ) => {
          if (typeof route.path === 'undefined') { return null; }
          let ctx = {store, module:route.module, req, res}
          return route.loadData ? route.loadData(ctx) : null;
        });

        Promise.all(promises).then(() => {
          const content = renderer(Routes, req, store, renderOpts, routerContext);

          if (context.url) {
            return res.redirect(301, context.url);
          }

          if (context.notFound) {
            res.status(404);
          }

          res.send(content);
        });
      });

      return app;
}

在server.js文件中,我称renderer为:

        const content = renderToString(
        <Provider store={store}>
            <StaticRouter location={req.url} context={routerContext} basename= {opts.baseName || ''}>
                <div>{renderRoutes(Routes)}</div>
            </StaticRouter>
        </Provider>
    );

这就是我得到语法错误的地方...我也尝试使用webpack和babel预编译我的server.js文件,然后将bin命令链接到bundle.js输出,但是它没有用,我弹出此错误屏幕:

在此处输入图片说明

在cli app中使用babel的正确方法是什么?

我在这里遵循了几个步骤,可以通过以下步骤找到您:https://babeljs.io/setup ,然后单击“ CLI”。 按照这些步骤,我可以将您的server.js JSX转换,再在一个新的新文件夹中添加几个。 为了转译您的代码,这是我所做的:

  1. 通过运行(使用所有默认值)创建package.json

    npm初始化

  2. 使用上面的小<Provider>摘录创建的src \\ server.js文件

  3. 运行以下命令以安装babel和react库:

    npm install --save-dev @ babel / core @ babel / cli

    npm install --save-dev @ babel / preset-env

    npm install --save-dev @ babel / preset-react

  4. 用以下这一行创建了一个.babelrc文件:

    {“预设”:[“ @ babel / preset-env”,“ @ babel / preset-react”]}

  5. 在package.json中创建了构建脚本

    脚本:{“ build”:“ babel src -d lib”}

  6. 运行构建:

    npm运行脚本构建

并且它成功运行并将js转换为lib文件夹中的新文件。 在一个全新的文件夹中尝试一下,让我知道如何为您工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM