vgo*_*ani 31 javascript python tornado flask reactjs
我需要在生产模式下运行React,这可能需要在环境中的某个地方定义以下内容:
process.env.NODE_ENV = 'production';
Run Code Online (Sandbox Code Playgroud)
问题是我在Tornado(一个python web-server)后面运行它,而不是Node.js. 我还使用Supervisord来管理龙卷风实例,所以在运行环境中如何设置它并不是很清楚.
但是我使用Gulp将我的jsx文件构建为javascript.
是否有可能以某种方式在Gulp中设置这个?如果是这样,我如何检查React是否在生产模式下运行?
这是我的Gulpfile.js:
'use strict';
var gulp = require('gulp'),
babelify = require('babelify'),
browserify = require('browserify'),
browserSync = require('browser-sync'),
source = require('vinyl-source-stream'),
uglify = require('gulp-uglify'),
buffer = require('vinyl-buffer');
var vendors = [
'react',
'react-bootstrap',
'jquery',
];
gulp.task('vendors', function () {
var stream = browserify({
debug: false,
require: vendors
});
stream.bundle()
.pipe(source('vendors.min.js'))
.pipe(buffer())
.pipe(uglify())
.pipe(gulp.dest('build/js'));
return stream;
});
gulp.task('app', function () {
var stream = browserify({
entries: ['./app/app.jsx'],
transform: [babelify],
debug: false,
extensions: ['.jsx'],
fullPaths: false
});
vendors.forEach(function(vendor) {
stream.external(vendor);
});
return stream.bundle()
.pipe(source('build.min.js'))
.pipe(buffer())
.pipe(uglify())
.pipe(gulp.dest('build/js'));
});
gulp.task('watch', [], function () {
// gulp.watch(['./app/**/*.jsx'], ['app', browserSync.reload]);
gulp.watch(['./app/**/*.jsx'], ['app']);
});
gulp.task('browsersync',['vendors','app'], function () {
browserSync({
server: {
baseDir: './',
},
notify: false,
browser: ["google chrome"]
});
});
gulp.task('default',['browsersync','watch'], function() {});
Run Code Online (Sandbox Code Playgroud)
Mon*_*dia 28
第一步:将以下内容添加到gulpfile.js中
gulp.task('apply-prod-environment', function() {
process.env.NODE_ENV = 'production';
});
Run Code Online (Sandbox Code Playgroud)
第二步:将其添加到您的默认任务(或用于服务/构建应用程序的任务)
// before:
// gulp.task('default',['browsersync','watch'], function() {});
// after:
gulp.task('default',['apply-prod-environment', 'browsersync','watch'], function() {});
Run Code Online (Sandbox Code Playgroud)
可选:如果您想要绝对禁止您处于产品模式,则可以创建以下略微增强的任务,而不是步骤I中的任务:
gulp.task('apply-prod-environment', function() {
process.stdout.write("Setting NODE_ENV to 'production'" + "\n");
process.env.NODE_ENV = 'production';
if (process.env.NODE_ENV != 'production') {
throw new Error("Failed to set NODE_ENV to production!!!!");
} else {
process.stdout.write("Successfully set NODE_ENV to production" + "\n");
}
});
Run Code Online (Sandbox Code Playgroud)
如果NODE_ENV未设置为"生产",则会抛出以下错误
[13:55:24] Starting 'apply-prod-environment'...
[13:55:24] 'apply-prod-environment' errored after 77 ?s
[13:55:24] Error: Failed to set NODE_ENV to production!!!!
Run Code Online (Sandbox Code Playgroud)
与其他答案类似,但希望给某人一个起点:
var vendorList = ['react', 'react-dom'];
gulp.task('vendor-dev', function() {
browserify()
.require(vendorList)
.bundle()
.on('error', handleErrors)
.pipe(source('vendor.js'))
.pipe(gulp.dest('./build/dev/js'));
});
gulp.task('vendor-production', function() {
process.env.NODE_ENV = 'production';
browserify()
.require(vendorList)
.bundle()
.on('error', handleErrors)
.pipe(source('vendor.js'))
.pipe(buffer())
.pipe(uglify({ mangle: false }))
.pipe(gulp.dest('./build/production/js'));
});
Run Code Online (Sandbox Code Playgroud)
主要区别在于我在捆绑供应商库之前明确设置了NODE_ENV.Gulp任务不能保证按顺序运行.
我在生产模式下运行吗?
如果删除uglify行(和之前的缓冲区),您会注意到dev和production构建的大小几乎相同 - 并且与行计数相匹配.
不同的是生产版本将被乱丢:
"production" !== "production" ? [show dev error] : [no nothing]
Run Code Online (Sandbox Code Playgroud)
大多数声誉良好的minify'(我相信)会删除deadend代码,如上所述,这将总是导致错误.
但是我该怎么说呢?
最容易确定的方法是,转到正在运行的应用程序的控制台并输入:
React.createClass.toString();
Run Code Online (Sandbox Code Playgroud)
输出应该是:
"function (e){var t=function(e,t,n){this.__reactAutoBindMap&&c(this),"[....and more and more]
Run Code Online (Sandbox Code Playgroud)
如果在react源中找到createClass,您将看到:
createClass: function (spec) {
var Constructor = function (props, context, updater) {
// This constructor is overridden by mocks. The argument is used
// by mocks to assert on what gets mounted.
if ("production" !== 'production') {
"production" !== 'production' ? warning(this instanceof Constructor, 'Something is calling a React component directly. Use a factory or ' + 'JSX instead. See: react-legacyfactory') : undefined;
}
// Wire up auto-binding
if (this.__reactAutoBindMap) {
bindAutoBindMethods(this);
}
Run Code Online (Sandbox Code Playgroud)
注意控制台输出如何直接跳过this.__reactAutobind
,因为你在生产模式下运行,并且使用minify'er,所有的!=='production'warngins和check都被跳过了.
归档时间: |
|
查看次数: |
17481 次 |
最近记录: |