【问题标题】:Illegal import declaration with gulp-react使用 gulp-react 进行非法进口申报
【发布时间】:2017-11-21 00:14:31
【问题描述】:

我正在尝试将带有 ES6 的 React 引入我的应用程序中,该应用程序是使用 Gulp 构建的。我可以让 React 单独工作,而 ES6 单独工作。但是尝试import 会使我的 Gulp 构建崩溃。 Gulp 的错误是:

第 14 行:非法进口声明

我的 HTML 页面包含 React 和构建的 JS 文件:

    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.12.2/react.min.js"></script>
    <script src="js/app.js"></script>

app.js 看起来像这样:

import {Child} from './child.js';

var Parent = React.createClass({
  render: function(){
    const y = 3;  //es6 works
    return (
      <div>
        <div> This is the parent {y}. </div>
        <Child name="child"/>
      </div>
    )
  }
});

React.render(<Parent />, document.getElementById('container'));

child.js 在同一目录下,如下所示:

var Child = React.createClass({
  render: function(){
    return (
      <div>
        and this is the <b>{this.props.name}</b>.
      </div>
    )
  }
});

export default Child;

我的 Gulp 文件中使用 Babel 编译 ES6 的部分:

gulp.task('babel', function(){
  gulp.src('js/app.js')
    .pipe(react())
    .pipe(babel({
      presets: ['es2015']
    }))
    .pipe(gulp.dest('dist/js'));
});

我错过了什么/做错了什么导致我无法使用import

【问题讨论】:

    标签: reactjs ecmascript-6 gulp babeljs


    【解决方案1】:

    您必须将es6module 选项应用于gulp-react 以允许导入模块:

    .pipe(react({
      es6module: true
    }))
    

    然后,修正您的导入语句。因为Child是默认导出的,所以导入如下:

    import Child from './child.js';
    

    注意:gulp-react 已被 gulp-babel 弃用,因此如果您已经将它用于es2015,我建议使用它。改用 gulp-babel 并为 Babel 安装 react 预设:

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

    最后应用到gulp-babel:

    presets: ['es2015', 'react']
    

    【讨论】:

    • 谢谢安德鲁。我认为这行得通,但是在这样做之后我又遇到了另一个错误。在浏览器中,我收到了来自 require Module name xxx has not been loaded yet for context 的控制台错误。所以我放弃了 Babel 并使用 Webpack 来编译 React 代码,现在看起来不错。
    • @AlanP。哦是的。 Babel 本身实际上并不是一个模块加载器,它只是一个转译器,因此会发生错误。使用 Webpack 还可以为 Web 转换模块,并且是可行的方法。
    【解决方案2】:

    试试

    import Child from './child';
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    • @Badacadabra 我不介意积分和声誉。我提供了工作代码,上面的用户用解释回答了它,所以给出与 Andrew 相同的解释是没有意义的。 如果他没有提供答案和解释,我会添加解释。
    猜你喜欢
    • 2015-10-15
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2021-11-04
    • 1970-01-01
    • 2012-06-30
    • 2016-03-16
    相关资源
    最近更新 更多