lamo4ok
@lamo4ok
Программист

Переменная NODE_ENV на продакшене должна быть установлена в 'production' только во время сборки проекта или же и во время его жизни?

Есть проект, он собирается на рабочем сервере (Debian) с помощью такого скритпа, прописанного в package.json: 'cross-env NODE_ENV=production webpack'. Вместе с этим, в конфиге Webpack используется такая конструкция:

new webpack.DefinePlugin({
    NODE_ENV: JSON.stringify(process.env.NODE_ENV || 'production'),
}),

То есть, по идее, у нас определенно в момент сборки переменная NODE_ENV будет установлена в значение 'production'. Даже если у нас не сработает утилита cross-env, в конфиге Webpack мы обнаружим, что process.env.NODE_ENV не имеет никакого значения и установим NODE_ENV в 'production'. Однако, после того, как мы соберем таким образом проект и посмотрим при его открытии в консоль в браузере, мы увидим вот такой примерно лог:

Warning: It looks like you're using a minified copy of the development build of React. When deploying React apps to production, make sure to use the production build which skips development warnings and is faster. See https://fb.me/react-minification for more details.
You are currently using minified code outside of NODE_ENV === 'production'. This means that you are running a slower development build of Redux. You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify or DefinePlugin for webpack (stackoverflow.com/questions/30030031) to ensure you have the correct code for your production build.

Естественно, я сходил по ссылкам, и ничего нового там не обнаружил, переменная NODE_ENV в момент сборки у нас установлена практически наверняка так, как следует. В связи с этим вопрос - возможно, она должна быть установлена таковой не только в момент сборки? Или же какие-то еще вещи влияют на появление в логах данных сообщений?

Уточнения:
  1. Webpack версии 2.х, минификация происходит с помощью такой конструкции:

    new UglifyJsPlugin({
    	exclude: /node_modules/,
    	sourceMap: true,
    	parallel: true,
    	uglifyOptions: {
    		ie8: true,
    		ecma: 6,
    	},
    }),

    То есть используется не встроенный в Webpack плагин, а установленный отдельной зависимостью "uglifyjs-webpack-plugin@1.1.6", так как со встроенным, версии 0.4.х (вроде так) были свои проблемы.
  2. Пробовал собирать проект на своей локальной среде с теми же настройками, она у меня Win 7, после чего закачивал ее на сервер - поведение аналогичное.
  • Вопрос задан
  • 1157 просмотров
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
Для того чтобы сделать production сборку, запускайте webpack с ключoм -p:
webpack -p
либо устанавливайте переменную process.env.NODE_ENV и используйте UglifyJsPlugin:
new webpack.DefinePlugin({
  'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
}),
new webpack.optimize.UglifyJsPlugin({
       // options 
    }),

при запуске с ключом -p, в кофиг добавляются именно эти строки.

Еще вариант:
plugins: [
  new webpack.EnvironmentPlugin(['NODE_ENV']),
  new webpack.optimize.UglifyJsPlugin({
      // options 
    }),
],


Строка:
new webpack.EnvironmentPlugin(['NODE_ENV']),
аналогична:
new webpack.DefinePlugin({
  'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
}),


А c NODE_ENV вы production сборку не сделаете, надо использовать именно process.env.NODE_ENV.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы