webpack2中react開發(fā)配置的示例分析

小編給大家分享一下webpack 2中react開發(fā)配置的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比濰坊網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式濰坊網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋濰坊地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。

基于webpack 2.3的標(biāo)準(zhǔn)語法,包含了less變量替換、React組件熱加載、第三庫單獨(dú)輸出、區(qū)分生產(chǎn)與開發(fā)環(huán)境等常用配置。

'use strict'

module.exports = function( env ) {
  // 生成環(huán)境下webpack使用-p參數(shù)開啟代碼壓縮
  // webpack[-dev-server]使用--env dev參數(shù)指定編譯環(huán)境
  var isDev = env == 'dev';

  var path = require( 'path' );
  var webpack = require( 'webpack' );
  var CleanWebpackPlugin = require( 'clean-webpack-plugin' );
  var CopyWebpackPlugin = require( 'copy-webpack-plugin' );
  var HtmlWebpackPlugin = require( 'html-webpack-plugin' );
  var WebkitPrefixer = require( 'autoprefixer' );
  var WebpackMd5Hash = require( 'webpack-md5-hash' );
  var BundleAnalyzerPlugin = require( 'webpack-bundle-analyzer' ).BundleAnalyzerPlugin;

  var sourcedir = path.resolve( __dirname, 'src' );// 源碼和資源文件的放置位置
  var outputdir = path.resolve( __dirname, 'build' );// 編譯結(jié)果的放置位置
  var webContextRoot = '/myreact/';// 應(yīng)用的實(shí)際訪問路徑,默認(rèn)是'/'
  // antd的圖標(biāo)字體文件的實(shí)際訪問路徑,利用less-load的變量替換功能
  var antd_fonticon = webContextRoot + 'assets/antd_fonticon/iconfont';

  var hasValue = function( item ) { return item != null; };
  return {
    //context: path.resolve( __dirname ),
    devtool: 'source-map',
    devServer: {
      host: '0.0.0.0',
      port: 8082,
      historyApiFallback: true
    },
    resolve: {
      // 讓less-loader等插件能找到以~相對定位的資源
      modules: [sourcedir, 'node_modules']
    },
    entry: {
      main: [
        // 編譯新版本js的新api(如Promise),主要是讓IE11能夠執(zhí)行編譯后的代碼
        'babel-polyfill',
        //使用react-hot-loader@3.0.0-beta.6,
        // 搭配webpack-dev-server --hot命令實(shí)現(xiàn)react組件的hot reload
        isDev ? 'react-hot-loader/patch' : null,
        path.resolve( sourcedir, 'main.jsx' )].filter( hasValue ),
      // 第三方庫匯總輸出
      vendor: ['bootstrap/dist/css/bootstrap.min.css', 'react',
        'react-dom', 'react-router', 'redux', 'react-redux',
        'react-router-redux', 'moment', 'lodash', 'immutable', 'whatwg-fetch',
        // 只含antd的js部分
        'antd',
        // 各控件還需引入各自的樣式文件
        'antd/lib/style/index.less']
    },
    output: {
      path: outputdir,
      filename: isDev ? 'js/[name].js' : 'js/[name]_[chunkhash:8].js',
      // 使用require.ensure造成的延遲加載的代碼文件
      chunkFilename: isDev ? 'js/chunk_[id]_[name].js'
        : 'js/chunk_[name]_[chunkhash:8].js',
      publicPath: webContextRoot
    },
    module: {
      rules: [{
        test: /\.jsx?$/,
        exclude: /(node_modules|bower_components)/,
        use: [{
          // 編譯新版本js語法為低版本js語法
          loader: 'babel-loader',
          options: {
            presets: [
              // 編譯es2015版本的js
              ['babel-preset-es2015', {
                modules: false
              }], 'babel-preset-stage-2',
              // 編譯jsx
              'babel-preset-react'],

            plugins: [// 支持熱加載react組件
              isDev ? 'react-hot-loader/babel' : null,
              // 減少重復(fù)的編譯后的輔助方法
              'babel-plugin-transform-runtime',
              // 按需加載組件的代碼和樣式
              ['babel-plugin-import', {
                libraryName: 'antd',
                style: true
              }]].filter( hasValue )
          }
        }]
      }, {
        test: /\.css$/,
        use: ['style-loader',
          {
            loader: 'css-loader',
            options: {
              // 第三方組件未以module方式引入css,所以不能在全局開啟css module
              modules: false
            }
          },
          { loader: 'postcss-loader', options: { plugins: [WebkitPrefixer] } }]
      }, {
        test: /\.less$/,
        use: ['style-loader',
          {
            loader: 'css-loader',
            options: {
              modules: false
            }
          },
          { loader: 'postcss-loader', options: { plugins: [WebkitPrefixer] } },
          {
            loader: 'less-loader',
            options: {
              modules: false,
              modifyVars: {
                // 替換antd用到的字體文件路徑
                "icon-url": JSON.stringify( antd_fonticon )
              }
            }
          }]
      }, {
        test: /\.(jpg|png|gif)$/,
        use: {
          loader: 'url-loader',
          options: {
            // 編碼為dataUrl的最大尺寸
            limit: 10000,
            // 輸出路徑,相對于publicPath
            outputPath: 'assets/',
            name: isDev ? '[name].[ext]' : '[name]_[hash:8].[ext]'
          }
        }

      }, {
        test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/,
        use: {
          loader: 'url-loader',
          options: {
            limit: 10000,
            mimetype: 'application/font-woff',
            outputPath: 'assets/',
            name: isDev ? '[name].[ext]' : '[name]_[hash:8].[ext]'
          }
        }
      }, {
        test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
        use: {
          loader: 'url-loader',
          options: {
            limit: 10000,
            mimetype: 'application/octet-stream',
            outputPath: 'assets/',
            name: isDev ? '[name].[ext]' : '[name]_[hash:8].[ext]'
          }
        }
      }, {
        test: /\.eot(\?v=\d+\.\d+\.\d+)?$/,
        use: {
          loader: 'url-loader',
          options: {
            limit: 10000,
            mimetype: 'application/vnd.ms-fontobject',
            outputPath: 'assets/',
            name: isDev ? '[name].[ext]' : '[name]_[hash:8].[ext]'
          }
        }
      }, {
        test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
        use: {
          loader: 'url-loader',
          options: {
            limit: 10000,
            mimetype: 'application/svg+xml',
            outputPath: 'assets/',
            name: isDev ? '[name].[ext]' : '[name]_[hash:8].[ext]'
          }
        }
      }]
    },
    plugins: [
      // momentjs包含大量本地化代碼,需篩選
      new webpack.ContextReplacementPlugin( /moment[\/\\]locale$/, /en-ca|zh-cn/ ),
      new webpack.optimize.OccurrenceOrderPlugin( true ),
      // 復(fù)制無需編譯的文件至輸出目錄
      new CopyWebpackPlugin( [{
        from: path.resolve( sourcedir, 'assets' ),
        to: 'assets'
      }] ),
      // 修復(fù)webpack的chunkhash不以chunk文件實(shí)際內(nèi)容為準(zhǔn)的問題
      new WebpackMd5Hash(),
      // 單獨(dú)打包輸出第三方組件,和webpack生成的運(yùn)行時(shí)代碼
      new webpack.optimize.CommonsChunkPlugin( {
        name: ['vendor', 'manifest']
      }),
      // 自動(dòng)填充js、css引用進(jìn)首頁
      new HtmlWebpackPlugin( {
        title: 'wzp react',
        template: path.resolve( sourcedir, 'index.html' ),
        inject: 'body' // Inject all scripts into the body
      }),
      // 設(shè)置環(huán)境變量
      new webpack.DefinePlugin( {
        process: {
          env: {
            // process.env.NODE_ENV==="production"
            // 應(yīng)用代碼里,可憑此判斷是否運(yùn)行在生產(chǎn)環(huán)境
            NODE_ENV: isDev ? JSON.stringify( 'development' )
              : JSON.stringify( 'production' )
          }
        }
      }),
      // print more readable module names on HMR updates
      isDev ? new webpack.NamedModulesPlugin() : null,
      // 先清理輸出目錄
      isDev ? null : new CleanWebpackPlugin( [outputdir] ),
      // 排除特定庫
      isDev ? null : new webpack.IgnorePlugin( /.*/, /react-hot-loader$/ ),
      // 輸出報(bào)告,查看第三方庫的大小
      isDev ? null : new BundleAnalyzerPlugin(
        {
          analyzerMode: 'static',
          reportFilename: 'report.html',
          openAnalyzer: true,
          generateStatsFile: false
        })
    ].filter( hasValue )
  }
};

以上是“webpack 2中react開發(fā)配置的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁標(biāo)題:webpack2中react開發(fā)配置的示例分析
URL地址:http://m.kartarina.com/article6/jedgig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司營銷型網(wǎng)站建設(shè)網(wǎng)頁設(shè)計(jì)公司靜態(tài)網(wǎng)站Google網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
主站蜘蛛池模板: 亚洲AV永久无码精品放毛片| 亚洲成a人在线看天堂无码| 亚洲AV无码成人精品区天堂| 爆乳无码AV一区二区三区| 无码欧精品亚洲日韩一区夜夜嗨 | 精品人妻无码一区二区三区蜜桃一 | 中文字幕精品无码久久久久久3D日动漫 | 国产精品热久久无码av| 精品一区二区无码AV| 中文字幕乱偷无码av先锋蜜桃| 大胆日本无码裸体日本动漫| 少妇无码一区二区二三区| 精品久久久无码中文字幕边打电话| 亚洲AV综合色区无码另类小说| 亚洲熟妇无码av另类vr影视| 国产精品无码一区二区在线观一| 伊人无码精品久久一区二区| 国产成人精品无码免费看 | 日韩人妻无码一区二区三区| 人妻无码一区二区三区免费| 人妻少妇无码视频在线| 中文字幕人成无码人妻综合社区| 日本无码色情三级播放| 无码一区二区三区亚洲人妻| 在线观看成人无码中文av天堂| 无码一区二区三区视频| 亚洲中文字幕无码爆乳AV| 日韩少妇无码喷潮系列一二三| 无码永久免费AV网站| 久久av无码专区亚洲av桃花岛 | 少妇特殊按摩高潮惨叫无码| 日韩精品无码熟人妻视频| 国产亚洲人成无码网在线观看| 久久亚洲国产成人精品无码区| 亚洲精品无码少妇30P| 亚洲国产AV无码一区二区三区| 人妻无码久久一区二区三区免费| 无码人妻精品一区二区三区夜夜嗨| 东京热无码一区二区三区av| 中文字幕乱码人妻无码久久| 国产网红无码精品视频|