亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

webpack 2的react開發配置實例代碼

2019-11-19 15:57:22
字體:
來源:轉載
供稿:網友

基于webpack 2.3的標準語法,包含了less變量替換、React組件熱加載、第三庫單獨輸出、區分生產與開發環境等常用配置。

'use strict'module.exports = function( env ) {  // 生成環境下webpack使用-p參數開啟代碼壓縮  // webpack[-dev-server]使用--env dev參數指定編譯環境  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' );// 編譯結果的放置位置  var webContextRoot = '/myreact/';// 應用的實際訪問路徑,默認是'/'  // antd的圖標字體文件的實際訪問路徑,利用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能夠執行編譯后的代碼        'babel-polyfill',        //使用react-hot-loader@3.0.0-beta.6,        // 搭配webpack-dev-server --hot命令實現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,              // 減少重復的編譯后的輔助方法              '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 ),      // 復制無需編譯的文件至輸出目錄      new CopyWebpackPlugin( [{        from: path.resolve( sourcedir, 'assets' ),        to: 'assets'      }] ),      // 修復webpack的chunkhash不以chunk文件實際內容為準的問題      new WebpackMd5Hash(),      // 單獨打包輸出第三方組件,和webpack生成的運行時代碼      new webpack.optimize.CommonsChunkPlugin( {        name: ['vendor', 'manifest']      }),      // 自動填充js、css引用進首頁      new HtmlWebpackPlugin( {        title: 'wzp react',        template: path.resolve( sourcedir, 'index.html' ),        inject: 'body' // Inject all scripts into the body      }),      // 設置環境變量      new webpack.DefinePlugin( {        process: {          env: {            // process.env.NODE_ENV==="production"            // 應用代碼里,可憑此判斷是否運行在生產環境            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$/ ),      // 輸出報告,查看第三方庫的大小      isDev ? null : new BundleAnalyzerPlugin(        {          analyzerMode: 'static',          reportFilename: 'report.html',          openAnalyzer: true,          generateStatsFile: false        })    ].filter( hasValue )  }};

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久6免费高清热精品| 91po在线观看91精品国产性色| 成人精品一区二区三区电影免费| 26uuu另类亚洲欧美日本一| 国产免费亚洲高清| 欧美巨大黑人极品精男| 久久亚洲电影天堂| 欧美成人精品三级在线观看| 91精品视频免费观看| 成人免费网站在线看| 在线视频欧美性高潮| 97免费中文视频在线观看| 欧美一级高清免费播放| 国产精品黄色影片导航在线观看| 日韩av在线免费观看一区| 国产精品成人一区| 久久免费视频网| 中文亚洲视频在线| 97在线看免费观看视频在线观看| 欧美在线观看www| 日韩精品免费综合视频在线播放| 日韩在线不卡视频| 91美女片黄在线观看游戏| 国产一区二区三区四区福利| 欧美中文在线免费| 欧美巨大黑人极品精男| 亚洲福利视频免费观看| 亚洲国产精彩中文乱码av在线播放| 久久久久国产精品免费网站| 精品久久久久人成| 亚洲午夜未满十八勿入免费观看全集| 欧美黑人xxxx| 成人夜晚看av| 成人亲热视频网站| 久久中文字幕一区| 亚洲国产精品va在看黑人| 国产97在线亚洲| 成人h视频在线观看播放| 成人精品久久一区二区三区| 久久97精品久久久久久久不卡| 91精品一区二区| 成人性教育视频在线观看| 久久99青青精品免费观看| 久久91精品国产91久久跳| 亚洲xxxx3d| 国产精品91在线观看| 国产一区二区三区丝袜| 疯狂做受xxxx高潮欧美日本| 国产精品久久久久久av福利| 欧美巨大黑人极品精男| 亚洲人午夜精品免费| 欧美日韩精品在线| 国内伊人久久久久久网站视频| 中文字幕精品av| 日韩精品高清视频| 日本亚洲欧洲色α| 日韩av在线免费播放| 色偷偷综合社区| 久久99国产综合精品女同| 中文字幕精品国产| 激情久久av一区av二区av三区| 欧美日产国产成人免费图片| 久久久久久国产三级电影| 综合136福利视频在线| 精品成人国产在线观看男人呻吟| 日韩中文字幕精品| 日韩电影大全免费观看2023年上| 国产一区二区在线免费视频| 国产99久久精品一区二区 夜夜躁日日躁| 欧美激情一区二区三区久久久| 91国内在线视频| 国产成人拍精品视频午夜网站| 91av在线国产| 久久五月情影视| 欧美午夜影院在线视频| 中文字幕一精品亚洲无线一区| 亚洲2020天天堂在线观看| 成人高清视频观看www| 亚洲欧美一区二区三区在线| 久久综合久久八八| 91亚洲精品久久久| 国产精品v片在线观看不卡| 久久精品免费播放| 精品香蕉在线观看视频一| 国产一区二区三区视频| 亚洲精品视频播放| 国内精品久久久久久中文字幕| 欧美国产日韩xxxxx| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美日韩一二三四五区| 久久九九国产精品怡红院| 亚洲精品久久久久久下一站| 国产黑人绿帽在线第一区| 亚洲一区亚洲二区亚洲三区| 国产专区欧美专区| 亚洲精品乱码久久久久久按摩观| 亚洲精品国产精品久久清纯直播| 国产欧美日韩中文字幕在线| 青青草原成人在线视频| 国产成人一区三区| 亚洲一区二区三区成人在线视频精品| 在线观看久久久久久| 国产亚洲精品久久久优势| 国产精品日韩欧美大师| 成人伊人精品色xxxx视频| 国产精品视频午夜| 欧美极品美女电影一区| 久久久久女教师免费一区| 精品日本美女福利在线观看| 成人黄色av网站| 国产精品久久久久久久久借妻| 国产精品丝袜白浆摸在线| 91爱视频在线| 91久久精品国产91久久性色| 久久久午夜视频| 91精品国产沙发| 国产午夜精品视频免费不卡69堂| 大量国产精品视频| 欧美第一淫aaasss性| 亚洲人成人99网站| 亚洲一区二区在线播放| 亚洲国产成人av在线| 国语自产精品视频在免费| 日韩精品在线免费观看| 欧美中文字幕在线观看| 亚洲欧美一区二区三区久久| 日本中文字幕久久看| 日韩免费观看av| 欧美xxxx18国产| 久久久久久久久国产| 亚洲欧美国产制服动漫| 日韩高清电影好看的电视剧电影| 91美女片黄在线观看游戏| 亚洲成人精品在线| 国产日韩欧美在线播放| 国产欧美精品在线| 俺去啦;欧美日韩| 亚洲国产高潮在线观看| 国产精品一区二区av影院萌芽| 日本高清不卡在线| 91大神福利视频在线| 草民午夜欧美限制a级福利片| 亚洲欧美日韩综合| 国产精品白嫩初高中害羞小美女| 中文字幕久久久| 精品国偷自产在线| 国产精品丝袜久久久久久不卡| 欧美重口另类videos人妖| 青青草国产精品一区二区| 狠狠躁夜夜躁人人爽天天天天97| 在线看片第一页欧美| 狠狠躁夜夜躁人人爽天天天天97| 日韩电影中文字幕一区| 97香蕉久久超级碰碰高清版| 中文字幕成人精品久久不卡| 午夜精品一区二区三区在线视| 国产精品久久久久久久久久免费| 国产成人精品久久久| 欧美性xxxx极品hd满灌| 欧美成人午夜激情视频| 国产91久久婷婷一区二区| 国产日韩欧美在线观看| 亚洲一区久久久| 色av吧综合网|