const path=require('path') const HappyPack = require('happypack')//ææå ä»»å¡åè§£æå¤ä¸ªåè¿ç¨å¹¶åç廿§è¡ module.exports={ //entryè¡¨ç¤ºå ¥å£ï¼webpackæ§è¡æå»ºçç¬¬ä¸æ¥å°ä»Entryå¼å§ï¼å¯æ½è±¡æè¾å ¥ //ç±»åå¯ä»¥æ¯ stringï¼objectï¼array entry:'./app/entry',//åªæä¸ä¸ªå ¥å£ï¼å ¥å£åªæä¸ä¸ªæä»¶ entry:['./app/entry1','./app/entry2'],//åªæä¸ä¸ªå ¥å£ï¼å ¥å£æä¸¤ä¸ªæä»¶ entry:{//ä¸ä¸¤ä¸ªå ¥å£ a:'./app/entry-a', b:['./app/entry-b1','./app/entry-b2'] }, //å¦ä½è¾åºç»æï¼å¨webpackç»è¿ä¸ç³»ç±»å¤çåï¼å¦ä½è¾åºæç»æ³è¦ç代ç output:{ //è¾åºæä»¶æ¾çç®å½ï¼å¿ é¡»æ¯stringç±»åçç»å¯¹è·¯å¾ path:path.resolve(__dirname,'dist'), //è¾åºæä»¶çåç§° filename:'bundle.js',//宿´çåç§° filename:'[name].js',//å¨é ç½®äºå¤ä¸ªentryæ¶ï¼éè¿å称模æ¿ä¸ºä¸åçentryçæä¸åçæä»¶åç§° filename:'[chunk].[hash].js',//æ ¹æ®æä»¶å 容çHashå¼çææä»¶çåç§°ï¼æµè§å¨é¿æ¶é´ç¼åæä»¶ //åå¸å°çº¿ä¸çææèµæºçURLåç¼ï¼ä¸ºstring publicPath:'./assets/',//æ¾å°æå®ç®å½ä¸ publicPath:'',//æ¾å°æ ¹ç®å½ä¸ publicPath:'https://cdn/example.com',//æ¾å°CDNä¸ //å°åºåºçåç§°ï¼ä¸ºstringï¼ä¸å¡«ä»æ¶ï¼é»è®¤çè¾åºæ ¼å¼æ¯å¿åçç«å³æ§è¡å½æ° library:'MyLibrary', //导åºåºçç±»åï¼ä¸ºæä¸¾ç±»åï¼é»è®¤æ¯var //numd,num2,commonjs2,commonjs,amd,this,var,assign,window,global,jsonp,å¯ä»¥æ¯è¿äºç±»å libraryTarget:'umd', //æ¯å¦å 嫿ç¨çæä»¶è·¯å¾ä¿¡æ¯å°çæä»£ç éï¼ä¸ºbooleanleix pathinfo:true, //éå chunkçæä»¶åç§° chunkFilename:'[id].js', chunkFilename:'[chunkhash].js', //JSON弿¥å è½½èµæºæ¶åè°å½æ°åç§°ï¼éè¦åæå¡ç«¯æé jsonpFunction:'myWebpackJsonp', //çæSource Mapæä»¶çåç§° sourceMapFilename:'[file].map', //æµè§å¨å¼åè å·¥å ·é颿¾ç¤ºçèµæºæ¨¡ååç§° devtoolModuleFilenameTemplate:'webpack:///[resouce-path]', //弿¥å 载跨åçèµæºæ¶ä½¿ç¨çæ¹å¼ crossOriginLoading:'use-credentials', crossOriginLoading:'aninymous', crossOriginLoading:'false', }, optimization:{//æåå ¬å ±ä»£ç splitChunks:{ cacheGroups:{ //ä¸å页é¢ä¹é´çå ¬å ±æ¨¡å commons:{ chunks:'initial',//æå¼å§ç模å minChunks:2,//æå°æä¸¤ä¸ªå¤ç¨ }, //ç¬¬ä¸æ¹æ¨¡å vendor:{ chunks:'initial',//æå¼å§ç模å test:/node_modules/, name:"vendor" } } } } //é 置模åç¸å ³ module:{ rules:[//é ç½®Loader { test:/\.jsx?$/,//æ£åå¹é å½ä¸è¦ä½¿ç¨Loaderçæä»¶ include:[//åªä¼å½ä¸è¿éé¢çæä»¶ path.resolve(__dirname,'app') ], exclude:[//忽ç¥è¿éé¢çæä»¶ path.resolve(__dirname,'app/demo-files') ], use:[//使ç¨åªäºLoader,æå 忬¡åºï¼ä»åå¾å 'style-loader',//ç´æ¥ä½¿ç¨Loaderçåç§° { loader:'css-loader', options:{ //åhtml-loaderä¼ ä¸äºåæ° presets:[//æ å° ['env',{modules:false}]//ä¸ç¼è¯æES5è¯æ³ ] } } ] }, { test:/\.css?$/, use:'happypack.loader?id=css',//使ç¨å¤åè¿ç¨ç¼è¯ include:path.resolve('./src'), exclude:/node_modules/ } ], noParse:[//ä¸ç¨æ¥å欢åå¤ççæ¨¡å /special-library\.js$///ç¨æ£åå¹é ], plugins:[ new HappyPack({ id:'css', loader:['style-loader','css-loader'] }), new HappyPack({ id:'balel', loader:['balel-loader'] }), new WebpackParalleUglifyPlugin()//jsæä»¶ç串è¡å缩å为å¼å¯å¤ä¸ªåè¿ç¨å¹¶è¡æ§è¡ ],//é ç½®æä»¶ //é ç½®å¯»æ¾æ¨¡åçè§å resolve:{ modules:[//å¯»æ¾æ¨¡åçæ ¹ç®å½ï¼ä¸ºarrayç±»åï¼é»è®¤ä»¥node_modulesä¸ºæ ¹ç®å½ 'node_modules', path.resolve(__dirname,'app') ], extensions:['.js','.json','.jsx','.css'],//模åçåç¼å alias:{//模åå«åé ç½®ï¼ç¨äºæ å°æ¨¡å //å°'module'æ å°æ'new-module',åæ ·'module/path/file'ä¹ä¼è¢«æ å°æ'new-module/path/file' 'module':'new-module', //使ç¨ç»å°¾ç¬¦$åï¼å°'only-module'æ å°æ'new-module'ï¼ //使¯ä¸æ³ä¸é¢è¯´ç'module/path/file'ä¸ä¹ä¼è¢«æ å°æ'new-module/path/file' 'only-module$':'new-module', }, alias:[//aliasè¿æ¯æä½¿ç¨æ°ç»æ¥æ´è¯¦ç»å°è¿è¡é ç½® { name:'module',//èæ¨¡å alias:'new-module',//æ°æ¨¡å //æ¯å¦æ å°æ¨¡åï¼å¦ææ¯trueï¼ååªæ'module'ä¼è¢«æ å°ï¼å¦ææ¯false,'module/inner/path'ä¹ä¼è¢«æ å° onlyModule:true } ], symlinks:true,//æ¯å¦è·éæä»¶çè½¯è¿æ¥å»æç´¢æ¨¡åçè·¯å¾ descriptionFiles:['package.json'],//模åçæè¿°æä»¶ mainFields:['main'],//模åçæè¿°æä»¶éé¢æè¿°çå ¥å£æä»¶çåæ®µå enforeExtension:false,//æ¯å¦å¼ºå¶å¯¼å ¥è¯å¥åæåç¼å }, //è¾åºæä»¶çæ§è½æ£æ¥é ç½® performance:{ hints:'warning',//ææ§è½é®é¢æ¶è¾åºè¦å hints:'error',//ææ§è½é®é¢æ¶è¾åºé误 hints:false,//å ³éæ§è½æ£æ¥ maxAssetSize:200000,//æå¤§æä»¶ç大å°(åä½ä¸ºbytes) maxEntrypointSize:400000,//æå¤§å ¥å£æä»¶çå¤§å° assetFilter:function(assetFilename){//è¿æ»¤è¦æ£æ¥çæä»¶ return assetFilename.endsWith('.css')||assetFilename.endsWith('.js') } }, devtool:'source-map',//é ç½®source-mapç±»å context:__dirname,//Webpack使ç¨çæ ¹ç®å½ï¼stringç±»åå¿ é¡»æ¯ç»å¯¹è·¯å¾ target:'web',//æµè§å¨é»è®¤ target:'webworker',//WebWorker target:'node',//Node.js,使ç¨'require'è¯å¥å è½½Chunk代ç target:'async-node',//nw.js target:'electron-main',//electronï¼ä¸»çº¿ç¨ target:'electron-renderer',//electron,渲æçº¿ç¨ externals:{//ä½¿ç¨æ¥èªJavaScriptè¿è¡ç¯å¢æä¾çå ¨å±åé jquery:'jQuery' }, stats:{//æ§å¶å°è¾åºæ¥å¿æ§å¶ assets:true, colors:true, errors:true, errorDetails:true, hash:true }, devServer:{//DevServerç¸å ³çé ç½® proxy:{//代çå°å端æå¡æ¥å£ '/api':'http://loaclhost:3000' }, //é ç½®DevServer HTTP æå¡å¨çæä»¶æ ¹ç®å½ contentBase:path.join(__disname,'public'), compress:true,//æ¯å¦å¯å¼Gzipå缩 historyApiFallback:true,//æ¯å¦å¼æ¾HTML5 History API ç½é¡µ hot:true,//å¯å¨æ¨¡åçå è½½ï¼éè¦å¼å ¥webpack.HotModuleReplacementPlugin()æä»¶ https:false,//æ¯å¦å¼å¯HTTPSæ¨¡å¼ inline:true,//å¨æå æä»¶æ³¨å ¥ä¸ä¸ªwebsocket客æ·ç«¯ open:true,//æå¼æµè§å¨ }, profile:true,//æ¯å¦ææWebpackæå»ºçæ§è½ä¿¡æ¯ï¼ç¨äºåæè¯´æåå å¯¼è´æå»ºæ§è½ä¸ä½³ cache:false,//æ¯å¦å¯ç¨ç¼åæ¥æåé度 watch:true,//表示æ¯å¦çæ§æºæä»¶çååï¼å½æºæä»¶åçååä¹åï¼éæ°æå wathOpyions:{//ç嬿¨¡å¼xuanx //ä¸çå¬çæä»¶æè æä»¶å¤¹ï¼æ¯ææ£åå¹é ï¼é»è®¤ä¸ºç©º ignored:/node_modules/, //çå¬å°åååç300ms卿§è¡å¨ä½ï¼æªæµé²æ¢æä»¶æ´æ°å¤ªå¿«å¯¼è´éæ°ç¼è¯é¢ç太快 aggregateTimeout:300, //ä¸åç询é®ç³»ç»æå®çæä»¶ææ²¡æåçååï¼é»è®¤æ¯ç§è¯¢é®1000次 poll:1000 } } } //注å server Workers if(navigator.serviceWorker){ window.addEventListener('DOMContentLoaded',function(){ //è°ç¨serviceWorker.register注åï¼åæ°/sw.js ä¸ºèæ¬æå¨çURLè·¯å¾ navigator.serviceWorker.register('/sw.js') }) } //ç¼åçæ¬çå¯ä¸æ è¯ç¬¦ï¼ç¨å½åäºä»¶ä»£æ¿ let cacheKey=new Date().toISOString(); //å½åç¼åçç½ååï¼å¨æ°èæ¬ç install äºä»¶éå°ä½¿ç¨ç½ååéé¢ç key let cacheWhitelist=[cacheKey] //éè¦è¢«ç¼åçæä»¶ç URL å表 let cacheFileList=[ 'index.html', 'app.js', 'app.css' ]; //å¨Service Workers å®è£ æåä¹å伿´¾å install äºä»¶ self.addEventListener('install',function(event){ //çææèµæºç¼å宿æ¶ï¼æå¯ä»¥è¿è¡ä¸ä¸æ¥ event.waitUntil( caches.open(cacheKey).then(function(cache){ //è¦ç¼åæä»¶ç URL å表 return cache.addAll(cacheFileList); }) ) }); //æ¦æªç½ç»è¯·æ± self.addEventListener('fetch',function(event){ event.respondWith( //å»ç¼å䏿¥è¯¢å¯¹åºçè¯·æ± caches.match(event.request).then(function(response){ if(response){ return response }else{ return fetch(event.request) } }) ) }); //æ°çService Workers 线ç¨å徿§å¶æåï¼å°ä¼è§¦å activate äºä»¶ self.addEventListener('activate',function(event){ event.waitUntil( caches.keys().then(function(cacheNames){ return Promise.all(cacheNames.map(function(cacheName){ //妿ä¸å¨ç½ååä¸ç¼åå ¨é¨æ¸ çæ if(cacheWhitelist.indexOf(cacheName)===-1){ //å é¤ç¼å return caches.delete(cacheName) } })) }) ) }) //ä¼åwebpack // 1. ä¾§éä¼åå¼åä½éªçæä»¶ const path = require('path') const CommonsChunkPlugin = require('webpack/lib/optimize/CommonChunkPlugin') const HappyPack = require('happypack')//ä¸ä¸ªä»»å¡åæå¤ä¸ªåè¿ç¨å¹¶è¡ //èªå¨å¯»æ¾ pages ç®å½ä¸çææç®å½ï¼å°æ¯ä¸ä¸ªç®å½çåä¸ä¸ªå页é¢åºç¨ const autoWebPlugin = new autoWebPlugin('./src/pages',{ //HTML æ¨¡æ¿æä»¶æå¨çæä»¶è·¯å¾ template: './template.html', //æåææé¡µé¢çå ¬å ±ä»£ç commonsChunk:{ //æåå ¬å ±ä»£ç Chunk çåç§° name: 'common' } }) module.exports={ //AutoWebPlugin ä¼ä¸ºå¯»æ¾å°çææå页é¢åºç¨çæå¯¹åºçå ¥å£é ç½® //éè¿autoWebPlugin.entryæ¹æ³å¯ä»¥è·åçæå ¥å£çé ç½® entry:autoWebPlgin.entry({ //è¿éæä»¬éè¦å¼å ¥é¢å¤éè¦ç Chunk å ¥å£ base:'./src/base.js' }), output:{ filename:'[name].js' }, resolve:{ //使ç¨ç»å¯¹è·¯å¾ææç¬¬ä¸æ¹æ¨¡ååæ¾çä½ç½®ï¼ä»¥åå°æç´¢æ¥éª¤ //å ¶ä¸__dirname 表示å½åå·¥ä½ç®å½ï¼ä¹å°±æ¯é¡¹ç®çæ ¹ç®å½ modules:[path.resolve(__disname,'node_modules')], //é对Npmä¸çç¬¬ä¸æ¹æ¨¡åï¼ä¼å éç¨ jsnext:main 䏿åç ES6模ååè¯æ³çæä»¶ï¼ä½¿ç¨ Tree Shaking ä¼å //åªéç¨ main åæ®µä½ä¸ºå ¥å£æä»¶æè¿°å段ï¼ä»¥åå°æç´¢æ¥éª¤ mainFileds:['jsnext:main','main'], }, module:{ rules:[ {//å¦æé¡¹ç®æºç ä¸åªæ js æä»¶ï¼å°±ä¸è¦åæ /\.jsx?$/,以æåæ£å表达å¼çæ§è½ test:/\.js$/, //ä½¿ç¨ HappyPack å éæå»º use:['happypack/loader?id=babel'], //åªå¯¹æ ¹ç®å½åºä¸ç src ç®å½æä»¶éç¨ babel-loader include:path.resolve(__dirname,'src'), }, { //å¢å 对cssæä»¶çæ¯æ test:/\.css/, use:['happypack/loader?id=css'] } ] }, plugins:[ autoWebPlugin, //ä½¿ç¨ HappyPack å éæå»º new HappyPack({ id:'babel', //babel-loader æ¯æç¼å转æ¢åºçç»æï¼éè¿ cacheDirectory é项å¼å¯ loaders:['babel-loader?cacheDirectory'] }), new HappyPack({ //UI ç»ä»¶å è½½æå id:'ui-component', loaders:[{ loader:'ui-component-loader', options:{ lib:'antd', style:'style/index.css', camel2:'-' } }] }), new HappyPack({ id:'css', //å¦ä½å¤ç.cssæä»¶ï¼ç¨æ³å Loader é ç½®ä¸ç䏿 · loaders:['style-loader','css-loader'] }), //æåå ¬å ±ä»£ç new CommonsChunkPlugin({ chunks:['common','base'], //å°å ¬å ±ä»£ç æ¾å° base ä¸ name:'base' }) ], watchOptions:{ //使ç¨èªå¨å·æ°ï¼ä¸çå¬çnode_modules ç®å½ä¸çæä»¶ ignored:/node_modules/ } } //2.é 置侧éä¼åè¾åºè´¨éçæä»¶ const path = require('path') const DefinePlugin = require('webpack/lib/DefinePlugin') const ModuleConcatenationPlugin=require('webpack/lib/optimize/CommonsChunkPlugin') //èªå¨å¯»æ¾ pages ç®å½ä¸çææç®å½ï¼å°æ¯ä¸ä¸ªç®å½çåä¸ä¸ªå页é¢åºç¨ const autoWebPlugin = new autoWebPlugin('./src/pages',{ //HTML æ¨¡æ¿æä»¶æå¨çæä»¶è·¯å¾ template:'./template.html', //æåææé¡µé¢çå ¬å ±ä»£ç commonsChunk:{ //æåå ¬å ±ä»£ç CHunkçåç§° name:'common', }, //æå®åæ¾CSS æä»¶çCDNç®å½URL stylePublicPath:'//css.cdn.com/id/' }); //èªå¨å¯»æ¾ pages ç®å½ä¸çææç®å½ï¼å°æ¯ä¸ä¸ªç®å½çåä¸ä¸ªå页é¢åºç¨ const autoWebPlugin = new autoWebPlugin('./src/pages',{ //HTML æ¨¡æ¿æä»¶æå¨çæä»¶è·¯å¾ template: './template.html', //æåææé¡µé¢çå ¬å ±ä»£ç commonsChunk:{ //æåå ¬å ±ä»£ç Chunk çåç§° name: 'common' } }) module.exports={ //AutoWebPlugin ä¼ä¸ºå¯»æ¾å°çææå页é¢åºç¨çæå¯¹åºçå ¥å£é ç½® //éè¿autoWebPlugin.entryæ¹æ³å¯ä»¥è·åçæå ¥å£çé ç½® entry:autoWebPlgin.entry({ //è¿éæä»¬éè¦å¼å ¥é¢å¤éè¦ç Chunk å ¥å£ base:'./src/base.js' }), output:{ //为è¾åºçæä»¶åå ä¸ Hash å¼ filename:'[name]_[chunkhash:8].js', path:path.resolve(__dirname,'./dist'), //æå®åæ¾JavaScriptæä»¶çCDNç®å½URL publicPath:('//js.cdn.com/id/') }, resolve:{ //使ç¨ç»å¯¹è·¯å¾ææç¬¬ä¸æ¹æ¨¡ååæ¾çä½ç½®ï¼ä»¥åå°æç´¢æ¥éª¤ //å ¶ä¸__dirname 表示å½åå·¥ä½ç®å½ï¼ä¹å°±æ¯é¡¹ç®çæ ¹ç®å½ãå½node_modulesæ¾ä¸å°æ¶ï¼ä¼ç»§ç»æ¾æ°ç»ä¸çä¸ä¸é¡¹ï¼ä¸ä¸é¡¹åå¨çæ åµä¸ï¼ // modules:[path.resolve(__disname,'node_modules'),path.resolve(__disname,'bin')], modules:[path.resolve(__disname,'node_modules')], //é对Npmä¸çç¬¬ä¸æ¹æ¨¡åï¼ä¼å éç¨ jsnext:main 䏿åç ES6模ååè¯æ³çæä»¶ï¼ä½¿ç¨ Tree Shaking ä¼å //åªéç¨ main åæ®µä½ä¸ºå ¥å£æä»¶æè¿°å段ï¼ä»¥åå°æç´¢æ¥éª¤,å°å¯¹åºçpackage.jsonéé¢å»æ¾ï¼ææ²¡æé£ä¸ªå段 mainFileds:['jsnext:main','main'], //å«åé ç½®,彿¨¡åå è½½react模åçæ¶å,ç´æ¥å è½½åé¢çç»å¯¹è·¯å¾ï¼å¿«æ·æ¹å¼æè è·¯å¾ alias:{ react:path.resolve('.xxxxx') } }, module:{ noParse:[],//ä¸éè¦éå½å»å è½½æè è§£ææ¤æä»¶ rules:[ {//å¦æé¡¹ç®æºç ä¸åªæ js æä»¶ï¼å°±ä¸è¦åæ /\.jsx?$/,以æåæ£å表达å¼çæ§è½ test:/\.js$/, //ä½¿ç¨ HappyPack å éæå»º use:['happypack/loader?id=babel'], //åªå¯¹æ ¹ç®å½åºä¸ç src ç®å½æä»¶éç¨ babel-loader include:path.resolve(__dirname,'src'), }, { //å¢å 对cssæä»¶çæ¯æ test:/\.css/, //æåChunkä¸çcss代ç å°åç¬çæä»¶ä¸ use:ExtractTextPlugin.extract({ use: ['happypack/loader?id=css'], //æå®åæ¾cssä¸å¯¼å ¥åªæï¼ä¾å¦å¾çï¼çCDNç®å½URL publicPath:'//img.cdb.com/id/' }) } ] }, plugins:[ autoWebPlugin, //å¼å¯ScopeHoisting new ModuleConcatenationPlugin(), new HappyPack({ id:'babel', //babel-loader æ¯æç¼å转æ¢åºçç»æï¼éè¿ cacheDirectory é项å¼å¯ loaders:['babel-loader?cacheDirectory'] }), new HappyPack({ //UI ç»ä»¶å è½½æå id:'ui-component', loaders:[{ loader:'ui-component-loader', options:{ lib:'antd', style:'style/index.css', camel2:'-' } }] }), new HappyPack({ id:'css', //å¦ä½å¤ç.cssæä»¶ï¼ç¨æ³å Loader é ç½®ä¸ç䏿 · //éè¿minnimize é项å缩css代ç loaders:['css-loader?minimize'] }), new ExtractTextPlugin({ filename:`[name]_[contenthash:8].css` }), //æåå ¬å ±ä»£ç new CommonsChunkPlugin({ //ä» common åbaseä¸¤ä¸ªç°æçchunk䏿åå ¬å ±ä»£ç é¨å chunks:['common','base'], //å°å ¬å ±ä»£ç æ¾å° base ä¸ name:'base' }), new DefinePlugin({ //å®ä¹ NODE_ENV ç¯å¢åé为 production ,å»é¤react 代ç ä¸å¼åæ¶æéè¦çé¨å 'process.env':{ NODE_ENV:JSON.stringify('priduction') } }), //使ç¨ParallelUglifyPlugin å¹¶è¡å缩è¾åºçJavaScript代ç new ParallelUglifyPlugin({ uglifyJS:{ output:{ //æç´§åçè¾åº beautify:false, //å é¤æææ³¨é comments:false, }, compress:{ //å¨ UglifyJS å 餿²¡æç¨å°çä»£ç æ¶ä¸è¾åºè¦å warnings:false, //å 餿æconsoleè¯å¥ï¼å¯ä»¥å ¼å®¹IEæµè§å¨ drop_console:true, //å åµå·²å®ä¹ä½æ¯åªç¨å°ä¸æ¬¡çåé collapse_vars:true, //æååºç°å¤æ¬¡ä½æ²¡æå®ä¹åéå»å¼ç¨çéæå¼ reducr_vars:true } } }) ]