Как использовать библиотеку из CDN в проекте Webpack в производстве

Я хотел бы использовать react.min.js из CDN в производстве (например https://unpkg.com/react@15.3.1/dist/react.min.js)

каков наилучший способ получить Webpack для преобразования моего import React from 'react' заявления в const React = window.React вместо node_modules/react в пачке?

я делал это с resolve.alias такой:

на index.html:

<head>
  <script type="text/javascript" src="https://unpkg.com/react@15.3.1/dist/react.min.js"></script>
  <script type="text/javascript" src="/assets/bundle.js"></script>
</head>

In webpack.prod.config.js:

alias: {
  react$: './getWindowReact',
},

getWindowReact.js:

module.exports = window.React;

Примечание: в старом вопросе я не понимал, что здание реагирует на пакет Webpack с NODE_ENV=production вычеркнул бы propTypes проверка. Один из ответов фокусируется на этом.

3 ответов


в конфигурации webpack вы можете использовать externals опция, которая будет импортировать модуль из среды вместо того, чтобы пытаться решить его нормально:

// webpack.config.js
module.exports = {
  externals: {
    'react': 'React'
  }
  ...
};

подробнее здесь: https://webpack.js.org/configuration/externals/


Я создал https://github.com/mastilver/dynamic-cdn-webpack-plugin который делает именно это из коробки

const path = require('path')
const HTMLWebpackPlugin = require('html-webpack-plugin')
const DynamicCDNWebpackPlugin = require('dynamic-cdn-webpack-plugin')

module.exports = {
  entry: './main.js',
  output: {
    path: path.join(__dirname, 'build'),
    filename: 'bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader'
        }
      }
    ]
  },
  plugins: [
    new HTMLWebpackPlugin(),
    new ModulesCDNWebpackPlugin()
  ]
}

будет динамически добавлять unpkg.org URL-адреса и добавьте соответствующий код в свой пакет для загрузки librairies из global


все разработки только части React codebase, такие как проверки PropType, охраняются с помощью:

if ("production" !== process.env.NODE_ENV) {
  ..
}

чтобы удалить их из React в вашей собственной сборке, создав эквивалент minified React build в вашем собственном пакете, используйте DefinePlugin заменить ссылки на process.env.NODE_ENV С "production".

plugins: [
  // ...
  new webpack.DefinePlugin({
    'process.env.NODE_ENV': JSON.stringify('production')
  }),
  new webpack.optimize.UglifyJsPlugin({
    compressor: {
      warnings: false
    }
  })
  // ...
],

устранение мертвого кода Uglify затем удалит все это, так как он обнаружит этот код, завернутый в "production" !== "production" Регистрация недоступна.