【问题标题】:react-router web server for dev用于开发的 react-router Web 服务器
【发布时间】:2016-06-26 05:10:07
【问题描述】:

我刚刚开始使用 react-router,我想使用 browserHistory。到目前为止,我一直在开发使用带有 watchify 和 chrome 插件的热重载来监视我的静态内容的变化。这意味着我直接在静态内容上进行所有开发,并在不涉及 Web 服务器的情况下在浏览器中刷新该静态内容。

现在开始挑战 - 您不能在 file:// 上使用 browserHistory,因为源为 null 并且历史 api 会引发错误。此外,browserHistory 更好并被推荐,所以我想使用它。问题是它破坏了我的开发工作流程。如果每次我需要测试更改时都必须将静态内容部署到本地 tomcat 实例,这将非常慢。

我认为 NPM 社区一定已经有了解决方案,我只是不知道要搜索什么工具。我认为一定有一些 NPM 插件可以监控我的 SPA 内容的变化,构建它,然后将其部署到网络服务器。我对这样的工具进行了一些搜索,但到目前为止我还没有找到我需要的东西。

有人可以帮忙吗?我想也许我只需要 Grunt 自动推送到我的本地 tomcat ......无论解决方案是什么,我都需要一个快速的开发工作流程。 :)

【问题讨论】:

  • Grunt 当然可以在这里使用。我建议查看 webpack - webpack.github.io - 因为它是目前最流行的打包工具之一。我有一个类似的项目设置,其中 webpack(通过 NPM 启动)监视我的源文件中的更改并将包导出到所选目录。 Webpack 也有自己的开发服务器,但它是可选的。
  • 是的,我不确定我应该学习哪个,webpack 或 grunt。大量的框架和工具要学习,这需要时间。是什么让你选择了 webpack - 只是受欢迎程度?
  • 人气并没有受到影响。但是让我最快到达那里的是 Dan Abramov 的热重载工具(至少是第一个版本)依赖于 webpack。但是肯定有很多工具,甚至更多关于如何将它们组合在一起的意见。这些天我发现对 gulp 或 grunt 的需求不大 - 只是 npm 脚本和 webpack。
  • 其次是@Yair - 自从我开始使用 Webpack 以来,我真的不再觉得任务运行器有太多用处了。大多数事情都可以通过 Webpack 插件/加载器来完成,而任何不能完成的事情,我只是倾向于在我的 package.json 中制作一个 NPM 脚本。
  • 酷,我其实一直想保持纯粹的 npm,但不确定这样做是否会很难。你们对没有咕噜声的热重载工具集有什么好的参考吗?

标签: node.js reactjs npm react-router


【解决方案1】:

您可以使用带有 watchify 和 browsersync 的 gulp 任务来执行此操作。以下是它的外观:

注意 historyApiFallback() 允许使用 browserHistory。

var gulp = require('gulp');
var buffer = require('vinyl-buffer');
var sourcemaps = require('gulp-sourcemaps');
var source = require('vinyl-source-stream');
var browserSync = require('browser-sync');
var watchify = require('watchify');
var historyApiFallback = require('connect-history-api-fallback');
var htmltidy = require('gulp-htmltidy');
var filesize = require('gulp-filesize');
var concatCss = require('gulp-concat-css');
var minifyCss = require('gulp-minify-css');
var csslint = require('gulp-csslint');
var assign = require('lodash.assign');

var customOpts = {
  entries: ['./src/js/app.js'],
  transform: [
    [
      'babelify',
      {
        'plugins': ['transform-decorators-legacy'],
        'presets': ['es2015', 'react', 'stage-0']
      }
    ],
    'brfs'
  ],
  debug: true,
  cache: {},
  packageCache: {},
  fullPaths: true
};

var opts = assign({}, watchify.args, customOpts);
var bundler = browserify(opts);

function bundle() {
  return bundler
      .bundle()
      .pipe(source('app.js'))
      .pipe(buffer())
      .pipe(filesize())
      .pipe(sourcemaps.init({loadMaps: true}))
      .pipe(filesize())
      .pipe(sourcemaps.write('./'))
      .pipe(gulp.dest('./dist/js'));
}
gulp.task('serve', ['js', 'css'], function() {
  var watch = watchify(bundler);
  // Without the line, update events won't be fired
  watch.bundle().on('data', function() {});

  browserSync({
    server: {
      baseDir: 'dist',
      middleware: [historyApiFallback()]
    },
    port: 8000,
    ui: {
      port: 8001
    }
  });

  gulp.watch(['*.html'], {cwd: 'src'}, ['html', browserSync.reload]);
  gulp.watch(['css/**/*.css'], {cwd: 'src'}, ['css', browserSync.reload]);
  bundler.on('update', bundle); // on any dep update, runs the bundler
  gulp.watch(['js/**/*.js'], {cwd: 'dist'}, browserSync.reload);
});

gulp.task('js', bundle);

gulp.task('css', function () {
  return gulp.src('css/**/*.css', {cwd: 'src'})
    .pipe(csslint({
      'compatible-vendor-prefixes': false,
      'box-sizing': false
    }))
    .pipe(concatCss('app.css'))
    .pipe(minifyCss())
    .pipe(gulp.dest('./dist/css'));
});

gulp.task('html', function () {
  return gulp.src('**/*.html', {cwd: 'src'})
    .pipe(htmltidy())
    .pipe(gulp.dest('./dist'));
});

【讨论】:

  • 这个history api fallback有什么作用?
  • 它是一个中间件,允许为一个页面应用程序提供服务。默认情况下,brosersync 将尝试加载与输入的 URL 对应的 HTML 页面,这显然不适用于单页应用程序。中间件允许 browsersync 使用 browserhistory 为一页应用加载 URL。
  • 我试图了解它是如何工作的,因为它看起来很棒。你说“尝试加载与输入的url对应的html页面”,但我不太明白你的意思。我认为这可能是我现在知道的最好的解决方案,所以我会尽快尝试。
  • 还有一件事——真的需要 gulp 吗?看来我可以使用纯 npm 和 browsersync 来实现这一点,不是吗?当然,我不知道如何翻译这个来删除 gulp
  • 是的,它还带有管理 UI,以及浏览器/设备之间的同步(如果您在不同的浏览器/设备上启动由 browsersync 提供的同一页面,您的操作将发送给所有这些)
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2016-05-03
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
相关资源
最近更新 更多