用于混合风格项目的 browserify (grunt, reactjs + plain js)

browserify for mixed-style project (grunt, reactjs + plain js)

对于将 reactjs 与普通 javascript 一起使用的项目,在 grunt 中配置 browserify 插件的最佳方法是什么? IE。假设我想在我的项目和目录结构中的每个 js 文件中使用 require(...) 如下所示:

/js/model/foo.js (plain javascript)
/js/model/... (plain javascript)
/js/services/foo-service.js (plain javascript)
/js/view/foo-item-view.jsx (reactjs)
/js/view/... (reactjs)
/js/main.js (plain javascript, entry point)
etc.

我想对 /js/view/... 目录中的所有文件应用 reactjs 转换,然后使用 browserify 转换所有内容。我找不到干净的方法来做到这一点。

有可能吗?

更新:

好吧,我觉得我的问题有点不清楚。我知道这绝对是可行的,这就是我现在正在做的事情(对我来说这看起来像是 hack):

// Project configuration.
grunt.initConfig({
  pkg: grunt.file.readJSON('package.json'),
  watch: {
    scripts: {
      files: ['web/js/**/*.js', 'web/html/index.html'],
      tasks: ['copy', 'react', 'browserify']
    }
  },
  copy: {
    main: {
      files: [
        {
          src: 'web/html/index.html',
          dest: 'target/web/index.html'
        },
        {
          cwd: 'web/js',                // source js dir
          src: ['**', '!**/*.jsx'],     // copy all files and subfolders to the temporary dor, except for jsx
          dest: 'target/web/tmp/js',    // destination folder, used by browserify
          expand: true                  // required when using cwd
        }
      ]
    }
  },
  react: {
    dynamic_mappings: {
      files: [
        {
          expand: true,
          cwd: 'web/js/view',
          src: ['**/*.jsx'],
          dest: 'target/web/tmp/js/view',
          ext: '.js'
        }
      ]
    }
  },
  browserify: {
    dist: {
      files: {
        'target/web/js/app.js': ['target/web/tmp/js/main.js'],
      }
    }
  }
});

这对我来说看起来不太优雅,因为在 browserify 任务中有额外的副本而不是 'reactifying' 源。可能是我遗漏了什么,这个解决方案可以简化吗?

您可以 运行 jsx 转换所有内容。它不会对常规 JavaScript 代码做任何事情。

除此之外的任何内容都是优化,但只需使用 watchify(或 watchify g运行t 插件),您不会注意到。


回应评论和编辑...你真的需要 g运行t 吗?

npm i -D browserify watchify reactify

然后在你的 package.json:

  "scripts": {
    "build": "browserify src/main.js -o dist/bundle.js",
    "watch": "watchify src/main.js -o dist/bundle.js"
  },
  "browserify": {
    "transform": ["reactify"]
  }

你也可以让所有的东西都是.js,我觉得这样更简单。如果您需要其他一些东西,例如 css 预处理器、图像压缩、精灵表、运行ning 测试等,您应该使用像 grunt/gulp 这样的工具。

对于 browserify,我发现单独使用 watchify 更容易。