【问题标题】:React and Grunt - Envify NODE_ENV='production' and UglifyJSReact 和 Grunt - Envify NODE_ENV='production' 和 UglifyJS
【发布时间】:2014-09-09 18:01:15
【问题描述】:

我正在使用 Grunt 来构建一个 React 项目,并且我想要拥有“开发”和“产品”两种风格。正如反应文档所说:

要在生产模式下使用 React,请将环境变量 NODE_ENV 设置为生产。 执行死代码消除的压缩器(例如 UglifyJS)是 建议完全删除开发模式中存在的额外代码。

我是使用 grunt、browserify 和其他东西的新手,但让我们看看。我遇到的第一个问题是 envify,我将其用作转换:

browserify: {
  options: {
    transform: ['reactify'],
    extensions: ['.jsx']
  },
  dev:{
    options: {
      watch: true //Uses watchify (faster)
    },
    src: ['js/app.js'],
    dest: 'js/bundle.js'
  },
  /**
   * To use React in production mode, set the environment variable NODE_ENV to production.
   * A minifier that performs dead-code elimination such as UglifyJS is
   * recommended to completely remove the extra code present in development mode.
   **/
  prod: {
    options: {
     transform: ['envify'] //How to set up NOD_ENV='production' ?
    },
    src: ['js/app.js'],
    dest: 'js/bundle.js'
  }
},

好的,执行 grunt:dev 就可以了。所以当运行 grunt:prod... 我如何设置 NODE_ENV: 'production'?我的意思是,我知道我将 'envify' 作为转换传递,但是......不知道如何使用它。

在这之后,我还有一个uglify任务:

uglify: {
 prod: {
   files: {
     'js/bundle.min.js': ['js/bundle.js']
   }
 }
}

所以在调用 grunt:prod 之后,它创建的是两个文件(bundle.jsbundle-min.js)。在生产中,我只想拥有bundle.min.js。我知道我能做到:

js/bundle.js': ['js/bundle.js']

但是嗯,我不知道是否有办法将其重命名为 bundle.min.js,我猜是这样......问题是在我的 html 中:

<script src="js/bundle.js"></script>

这里还有一个技巧可以让它接受 bundle.js 或 bundle.min.js 吗?

提前致谢。

【问题讨论】:

    标签: javascript node.js gruntjs reactjs browserify


    【解决方案1】:

    变换是本地的,制作精良的包将它们的变换放在它们的 package.json 文件中。除非您在您自己的代码 中使用 envify,否则您不需要对它做任何事情。

    您需要的是grunt-env,或者其他设置环境变量的方法。

    这是使用 package.json 的替代方法:

    {
      "scripts": {
        "build": "NODE_ENV=development grunt build-dev",
        "dist": "NODE_ENV=production grunt dist"
      }
    },
    "devDependencies": {
      "grunt": "...",
      "grunt-cli": "..."
    }
    

    这里的好处是使用你的包的人甚至不需要全局安装 grunt。 npm run build 将运行 ./node_modules/.bin/grunt build-dev 并设置正确的环境变量。

    【讨论】:

    • 太好了!谢谢你。关于我问题的最后一部分,有什么建议吗?
    • 我一直使用 grunt-env(效果很好!),但没有想到 package.json 方法中的脚本。方便的提示!
    • 你真的确认这适用于 React 吗?我认为 React 在 package.json 中不包含任何转换。我不确定你所描述的是否足以真正羡慕 React。
    • 答案是对的。这适用于在其package.json 中指定browserify 配置的包。 React 可以做到这一点,但一些生态系统项目却没有。如有疑问,请检查:-)
    【解决方案2】:

    John Reilly 和 FakeRainBrigand 的答案都对我不起作用。对我有用的是:

    第 1 步 - 在 package.json 所在的位置运行此命令

    npm i grunt-env --save-dev
    

    第 2 步 - 将“evn:”中的代码添加到 grunt.initConfig 中的 Gruntfile.js,如下所示:

    grunt.initConfig({
    
    ...
    
    env: {
        prod: {
            NODE_ENV: 'production'
        }
    },
    
    ...
    
    });
    

    第 3 步 - 将 grunt 任务添加到您的 Gruntfile.js

    grunt.loadNpmTasks('grunt-env');
    

    第 4 步 - 在 browserify 之前调用它,如下所示:

    grunt.registerTask("default", ["env", "browserify"]);
    

    【讨论】:

    • 完美 - 已经为此苦苦挣扎了一段时间,这为我解决了!
    • 这对我也有用,因为我没有使用 npm 任务构建我的包,而是直接运行 grunt。
    【解决方案3】:

    只是对 FakeRainBrigand 出色答案的补充,如果您在 Windows 上运行(像我一样),那么您需要在 scripts 部分使用稍微不同的语法:

    {
      "scripts": {
        "build": "SET NODE_ENV=development&&grunt build-dev",
        "dist": "SET NODE_ENV=production&&grunt dist"
      }
    },
    "devDependencies": {
      "grunt": "...",
      "grunt-cli": "..."
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2012-03-04
    • 2015-06-20
    相关资源
    最近更新 更多