webpack 2的react开发配置实例代码
基于webpack2.3的标准语法,包含了less变量替换、React组件热加载、第三库单独输出、区分生产与开发环境等常用配置。
'usestrict'
module.exports=function(env){
//生成环境下webpack使用-p参数开启代码压缩
//webpack[-dev-server]使用--envdev参数指定编译环境
varisDev=env=='dev';
varpath=require('path');
varwebpack=require('webpack');
varCleanWebpackPlugin=require('clean-webpack-plugin');
varCopyWebpackPlugin=require('copy-webpack-plugin');
varHtmlWebpackPlugin=require('html-webpack-plugin');
varWebkitPrefixer=require('autoprefixer');
varWebpackMd5Hash=require('webpack-md5-hash');
varBundleAnalyzerPlugin=require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
varsourcedir=path.resolve(__dirname,'src');//源码和资源文件的放置位置
varoutputdir=path.resolve(__dirname,'build');//编译结果的放置位置
varwebContextRoot='/myreact/';//应用的实际访问路径,默认是'/'
//antd的图标字体文件的实际访问路径,利用less-load的变量替换功能
varantd_fonticon=webContextRoot+'assets/antd_fonticon/iconfont';
varhasValue=function(item){returnitem!=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组件的hotreload
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,所以不能在全局开启cssmodule
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包含大量本地化代码,需筛选
newwebpack.ContextReplacementPlugin(/moment[\/\\]locale$/,/en-ca|zh-cn/),
newwebpack.optimize.OccurrenceOrderPlugin(true),
//复制无需编译的文件至输出目录
newCopyWebpackPlugin([{
from:path.resolve(sourcedir,'assets'),
to:'assets'
}]),
//修复webpack的chunkhash不以chunk文件实际内容为准的问题
newWebpackMd5Hash(),
//单独打包输出第三方组件,和webpack生成的运行时代码
newwebpack.optimize.CommonsChunkPlugin({
name:['vendor','manifest']
}),
//自动填充js、css引用进首页
newHtmlWebpackPlugin({
title:'wzpreact',
template:path.resolve(sourcedir,'index.html'),
inject:'body'//Injectallscriptsintothebody
}),
//设置环境变量
newwebpack.DefinePlugin({
process:{
env:{
//process.env.NODE_ENV==="production"
//应用代码里,可凭此判断是否运行在生产环境
NODE_ENV:isDev?JSON.stringify('development')
:JSON.stringify('production')
}
}
}),
//printmorereadablemodulenamesonHMRupdates
isDev?newwebpack.NamedModulesPlugin():null,
//先清理输出目录
isDev?null:newCleanWebpackPlugin([outputdir]),
//排除特定库
isDev?null:newwebpack.IgnorePlugin(/.*/,/react-hot-loader$/),
//输出报告,查看第三方库的大小
isDev?null:newBundleAnalyzerPlugin(
{
analyzerMode:'static',
reportFilename:'report.html',
openAnalyzer:true,
generateStatsFile:false
})
].filter(hasValue)
}
};
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。