【问题标题】:Why is my gulp task not converted jsx when using reactify transform with browserify and glob为什么我的 gulp 任务在使用带有 browserify 和 glob 的 reactify 转换时没有转换 jsx
【发布时间】:2023-04-03 13:15:01
【问题描述】:

我一直致力于将 grunt 任务转换为 gulp。 grunt 文件如下所示:

 browserify: {
     options: {
         transform: [ require('grunt-react').browserify ]
     },
     client: {
         src: ['react/**/*.jsx'],
         dest: 'public/js/browserify/bundle.js'
     }
}

我看到了很多 browserify 和 gulp 的例子,但它们都只有一个文件起点。为了解决这个问题,我尝试使用 glob。在几次错误的开始后,我想出了以下内容。它运行没有错误,并创建了一个 bundle.js 文件,但 reactify 似乎无法正常工作,因为 jsx 似乎没有被转换,所以我最终得到了错误:

未捕获的错误:找不到模块 './components/NoteApp.jsx'

var gulp = require('gulp');
var browserify = require('browserify');
var source = require('vinyl-source-stream');
var glob = require('glob');
var reactify = require('reactify');

gulp.task('browserify', function (cb) {
  glob('./react/**/*.jsx', {}, function (err, files) {
    var b = browserify();

    files.forEach(function (file) {
      b.add(file);
    });

    b.transform(reactify);

    b.bundle()
      .pipe(source('bundle.js'))
      .pipe(gulp.dest('./public/js/browserify/'));
    cb();
  }); 
});

ddprrt 要求提供有关结构的更多详细信息,因此这里是 react 文件夹的布局方式。代码取自这个article,它使用这个github zip 源来演示反应和回流。该项目非常接近我作为起点所需要的,但使用 Grunt 而不是 Gulp。

react 文件夹的结构如下:

反应\App.jsx \ Bootstrap.jsx \components\NoteApp.jsx \ NoteCreationBox.jsx \ 注意.jsx \ NoteListBox.jsx \ NoteList.jsx \TextArea.jsx

错误来自 App.jsx 文件中的一行:

var React = require('react');
var NoteApp=require('./components/NoteApp.jsx');

但更改此行会导致 gulp 对话失败并出现丢失文件错误。

【问题讨论】:

  • 我尝试使用一些基本文件重新创建示例,并且效果非常好。你能告诉我们你的文件是如何构成的吗?我有点困惑,您将所有 jsx 文件放在“react”文件夹中,但 NoteApp.jsx not 在该文件夹中。也许有一些路径问题正在发生。
  • @ddprrt 感谢您的回复,我已经更新了我的问题,提供了有关结构的更多详细信息。
  • 我用你的代码编译了这个项目,并且仍然运行良好。猜猜我们必须更深入:您使用什么操作系统?我正在考虑可能在您的系统上出现的区分大小写,但在原作者的系统上没有(也很奇怪,因为 Grunt 似乎工作,不是吗?)
  • 是的,Grunt 工作没有问题。 Gulp 编译正常,但是当我启动项目并在浏览器中对其进行测试时,我得到了无法找到模块'./components/NoteApp.jsx'。我在带有 Nginx 的 Ubuntu 14.04 Digital Ocean 云服务器上运行它。
  • 啊,现在我明白了。我看到 Grunt 和 Gulp 的包在不同部分相互比较时是不同的。现在正在检查版本号...

标签: reactjs gulp browserify gulp-glob


【解决方案1】:

我想我现在得到了答案。这确实是一些版本混淆,reactify 似乎更先进,并且处理的事情与原来的 reactify 不同。可能是因为两者都还处于实验状态。我也猜想 React/Reflux 继续前进,所以你最终得到了一些不太符合要求的版本。但是,您仍然可以修复它并运行您的应用程序:

var gulp = require('gulp');
var browserify = require('browserify');
var source = require('vinyl-source-stream');
var glob = require('glob');
var reactify = require('grunt-react').browserify;

gulp.task('browserify', function (cb) {
    glob('./react/Bootstrap.jsx', function (err, files) {
        var b = browserify({
            entries: files
        }).transform(reactify)
        .bundle()
        .pipe(source('bundle.js'))
        .pipe(gulp.dest('./public/js/browserify/'));
        cb();
    }); 
});

我们不使用require('reactify'),而是采用grunt-react 提供的reactify。请参阅上面的代码。您应该能够切换中间件。另外,不要查看所有文件,只查看您的主要入口点,在这种情况下是 Bootstrap.jsx

我知道这很不方便,也许当您尝试自己的应用时,请从新设置开始。

** 更新**

那是我之后的 package.json,只是在之前的项目中工作:

{
  "name": "react-note-app",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www",
    "main": "./bin/www"
  },
  "engines": {
    "node": ">= 0.10.0"
  },
  "dependencies": {
    "body-parser": "~1.8.1",
    "cookie-parser": "~1.3.3",
    "debug": "~2.0.0",
    "ejs": "~0.8.5",
    "express": "~4.9.0",
    "express-session": "^1.8.2",
    "morgan": "~1.3.0",
    "node-jsx": "^0.11.0",
    "react": "^0.11.2",
    "reflux": "^0.1.13",
    "serve-favicon": "~2.1.3"
  },
  "devDependencies": {
    "browserify": "^9.0.7",
    "glob": "^5.0.3",
    "grunt": "^0.4.5",
    "grunt-browserify": "^3.0.1",
    "grunt-contrib-watch": "^0.6.1",
    "grunt-nodemon": "^0.3.0",
    "grunt-react": "^0.9.0",
    "gulp": "^3.8.11",
    "react-tools": "^0.11.2",
    "reactify": "^1.1.0",
    "vinyl-source-stream": "^1.1.0"
  }
}

【讨论】:

  • 我明白了。这似乎摆脱了最初的问题,但我在 bundle.js 中得到了另一个错误:“未捕获的 TypeError:未定义不是函数”。我开始认为从这个项目开始并不是我希望的快速开始。我想它可能太过时了。
  • 我也有一点,我想我只是通过引用 Bootstrap.jsx 来修复它。但是你意识到了:这个应用程序不仅很难用不同的工具编译,它总体上也不是一个好的应用程序。文件夹结构过于拥挤和混乱,app.js文件也有很多问题。
  • 再次感谢您的帮助。我想我会带着这个回到绘图板上。我已将其标记为已解决,但希望这将作为对其他人的警告,不要继续这个根:)。有时,当事情看起来太复杂时,它们就是!
猜你喜欢
  • 1970-01-01
  • 2015-08-05
  • 2015-03-25
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多