具有 Flux 架构的 ReactJS 生成大型 JS 文件,最佳实践是啥?

Posted

技术标签:

【中文标题】具有 Flux 架构的 ReactJS 生成大型 JS 文件,最佳实践是啥?【英文标题】:ReactJS with Flux architecture generating large JS files, what is the best practice?具有 Flux 架构的 ReactJS 生成大型 JS 文件,最佳实践是什么? 【发布时间】:2016-02-24 14:55:49 【问题描述】:

我已经开始将 React 与 Flux 架构一起用于全功能的前端应用程序,我真的很喜欢 JSX 和 Flux 方法,但主要问题是当我使用 Gulp, Babel and Uglyfy 构建 JSX 文件时,我正在了解 1mb 缩小的 JS 文件,如果没有缩小模式,它会提供几乎 8mb 的 JS 文件。 这不是结束!用于发出 AJAX 请求的 React 没有内置功能,所以 我还需要包含 jQuery

我工作得很好,开发过程更快,代码比其他框架更好感谢 JSX但是如何使生产文件更小? 我只包含了一些用于 Flux 架构的库 Dispatcher and EventEmmiter。因此,这与我的代码中没有未使用的库无关。我认为这是因为我正在编写 JSX,而现在我将 html+JS 放在一个文件中。 拆分文件或使 JS 输出更小的最佳做法是什么?

谢谢!

【问题讨论】:

你可以做的是从缩小的 JS 中删除你的库,你可以使用 google cdn 来包含这些库,因为其中一些库已经缓存在用户浏览器中,你会减少你的服务器带宽使用率 【参考方案1】:

有一些步骤可以减少生产规模:

    使用 ReactJS 的生产版本,其中包括额外的性能优化并删除所有错误消息。 您不必包含整个 jQuery 库即可仅使用 Ajax,我建议使用其他轻量级库仅用于处理 ajax,例如reqwest 或 superagent。 当为生产构建时,分成两个 js 文件(或更多),通常我们将有一个名为 vendor.js 的文件用于所有库,app.js 用于我们制作的代码。这将利用浏览器上的缓存,因为 vendor.js 每次构建都不会发生太大变化。

【讨论】:

酷!在某些情况下,这似乎是一个解决方案……但我仍在努力寻找比浏览器缓存更好的解决方案,我也在考虑让服务器端渲染仅针对特定页面渲染 JSX 文件……有可能吗? 是的,你可以,我已经阅读了一些关于服务器端渲染的教程,例如reactjsnews.com/isomorphic-javascript-with-react-node 如果你切换到 Webpack(更适合 ReactJS 开发),这里有一个非常接近你意图的教程:jxnblk.com/writing/posts/…【参考方案2】:

我看到有一些关于在不同页面上使用 React 的信息,所以我从 Gulp documentation 中学到了很多东西,我发现了很多非常小的 JS 库 MicroJS 可以用一个 4 替换 Dispatcher and EventEmmiter -6 KB 大小当然你需要对它们进行一些手动操作,但是它们在 JS 文件大小上节省了大约 20 倍

这是我的 Gulp 文件,用于为每个页面生成缩小的反应包。 我正在使用 Django 作为后端

var gulp = require('gulp');
var uglify = require('gulp-uglify');
var htmlreplace = require('gulp-html-replace');
var source = require('vinyl-source-stream');
var browserify = require('gulp-browserify');
var reactify = require('reactify');
var babelify = require('babelify');
var streamify = require('gulp-streamify');
var fs = require("fs");
var rename = require("gulp-rename");

var path = 
  APP_DIR: './apps/*.jsx',
  OUT_DIR: './../static/apps',
;

process.env.NODE_ENV = 'development';

gulp.task('jsx', function() 

    return gulp.src([path.APP_DIR])
        .pipe(browserify(
            insertGlobals : true,
            debug : true,
            transform: [reactify, babelify.configure(
                presets: ["es2015", "react"]
            )],
        ))
        .pipe(rename(
            extname: ".min.js"
        ))
        .pipe(gulp.dest(path.OUT_DIR));

);
gulp.task('jsx_min', function() 

    return gulp.src([path.APP_DIR])
        .on('error', function (error) 
            console.log(error);
        )
        .pipe(browserify(
            insertGlobals : true,
            debug : false,
            transform: [reactify, babelify.configure(
                presets: ["es2015", "react"]
            )],
        ))
        .pipe(streamify(uglify().on('error', function (e) 
            console.log(e);
        )))
        .pipe(rename(
            extname: ".min.js"
        ))
        .pipe(gulp.dest(path.OUT_DIR));

);


gulp.task('build', ['jsx_min']);

gulp.task('default', ['jsx'], function () 
    return gulp.watch([path.APP_DIR], ['jsx', function () 
        var current_date = new Date();
        var time = current_date.getHours() + ":" + current_date.getMinutes() + ":" + current_date.getSeconds();
        console.log(time, " -> Rebuilding");
    ]);
);

现在对于每个逻辑页面,我得到了关于 40KB 的缩小 JS 文件,用于处理所有 JavaScript,包括 AJAX 功能。 所以我将我的问题标记为已回答:)

感谢您的帮助。

【讨论】:

以上是关于具有 Flux 架构的 ReactJS 生成大型 JS 文件,最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Stores 管理 Flux/ReactJS 应用程序中的状态?

reactJS:具有通量的同构应用程序

React Js - Flux 中的状态管理

Flux 架构和后端

在“回流”中,行动的目的是啥?

.net 的通量模式