如何在sailsjs 应用程序中使用ES6 导入和反应?

Posted

技术标签:

【中文标题】如何在sailsjs 应用程序中使用ES6 导入和反应?【英文标题】:How to use ES6 import and react in a sailsjs app? 【发布时间】:2018-12-21 17:53:44 【问题描述】:

我正在尝试更新一个网络应用程序以获取最新的sailsjs 和反应版本。该应用程序已经在使用sails v0.12 和 react v0.14.x 和 ES5 风格的 requirejs.config 导入,如下所示:

requirejs.config(
  urlArgs: "v=" + myapp.buildNumber,
  paths: 
    'react': '/bower_components/react/react-with-addons',
    'reactdom': '/bower_components/react/react-dom',
    'label': '/js/shared/reactLabel',      
    'moment': '/bower_components/moment/moment',   

  ,
  shim:     
    'reactRedux': ["react"]
  
    );


require(['react', 'label', 'moment', 'reactdom', ], 
    function (React, Label, moment, ReactDOM, ) 

...

现在,在更新大量 npm 包并升级到最新版本后,我正试图在 PCycle.jsx 中的一个简单组件上做出反应:

import React , Component  from 'react'


class PCycle extends Component 

  render()
    console.log(this.props);  

    return (
        <div className="post card" >hi world</div>
    )
  
;

但是当我加载该组件所在的页面时,我收到此错误并且该组件没有呈现。

VM3398 require.js:165 Uncaught Error: Module name "react" has not been loaded yet for context: _. Use require([])
http://requirejs.org/docs/errors.html#notloaded
    at makeError (VM80 require.js:165)
    at Object.localRequire [as require] (VM80 require.js:1429)
    at requirejs (VM80 require.js:1791)
    at VM1011 pCycle.js:3

我的应用程序中的其他页面仍然使用旧的 react 版本并且 require 语法仍然有效,所以也许我也可以在这个组件上使用 require 语法,但我宁愿能够通过导入来做事。 我是新来的反应和通天塔,所以我不确定我是否需要一些通天塔魔法或这里发生了什么。我应该发布我的各种配置 json 文件吗?我说的项目不是用 react cli 创建的新项目。

PS: 我的 /tasks/config 文件夹中有这个 babel.js 文件:

/**
 * Compile JSX files to javascript.
 *
 * ---------------------------------------------------------------
 *
 * Compiles jsx files from `assest/js` into Javascript and places them into
 * `.tmp/public/js` directory.
 *
 */
module.exports = function(grunt) 

  grunt.config.set('babel', 
    dev: 
      options: 
        presets: ["@babel/preset-env",'@babel/react']
      ,
      files: [
        
        expand: true,
        cwd: 'assets/js/',
        src: ['**/*.jsx'],
        dest: '.tmp/public/js/',
        ext: '.js'
        ,
        
          expand: true,
          cwd: 'assets/bower_components/react-notification-system',
          src: ['**/*.jsx'],
          dest: '.tmp/public/bower_components/react-notification-system',
          ext: '.js'
        
      ]
    
  );

  grunt.loadNpmTasks('grunt-babel');
;

也许那些 bower_component react-notification-system 以某种方式搞砸了,但 assets/bower_components 下没有这样的文件夹。

【问题讨论】:

【参考方案1】:

我不熟悉sailsjs,但是如果它在node 中运行,那么您将需要一些东西来转换es6 导入,因为node 还不完全支持它们。

你可以像这样使用 babel:

npm install --save-dev babel-cli babel-preset-env

然后在你的根目录下创建一个 .babelrc 文件来配置和添加这个:

"presets": ["env"]

如果您想打包文件以提供给客户端,您可以使用 webpack 或 parcel 之类的打包器。

【讨论】:

谢谢,我确定你在正确的轨道上,但我已经安装了一些 babel 的东西,虽然我不确定那个 cli。仅供参考,我使用上面的 babel.js 配置文件更新了我的帖子。我还没有开始捆绑任何东西。我还应该提到我们正在使用 Grunt。 我尝试按照您的建议进行操作,现在当我尝试运行该应用程序时,我收到此错误消息:错误:** Grunt :: 发生错误。 ** 错误: - - - - - - - - - - - - - - - - - - - - - - - -------------------------- 由于警告而中止。运行“babel:dev”(babel)任务警告:无法读取 null 的属性“绑定” 好的,感谢您的澄清。我之前没有使用过 es6 导入的 gulp 或 grunt,所以也许看看这个? ***.com/questions/41067220/…

以上是关于如何在sailsjs 应用程序中使用ES6 导入和反应?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React + ES6 + webpack 导入和导出组件?

SailsJS 到 Phonegap?

如何使用 ES6 模块导入文件,并将其内容作为字符串读取?

如何登录 SailsJS

iOS 中的 Sailsjs SocketIO

ES6 - 如何导入和别名命名导出的成员?