这是包装文章。requirejs的r.js用于打包。思路是通过entrance.js中的require.config对项目进行初步打包。因为router.js和store.js中的引用是动态生成的,所以r.js处理不了,这里用nodejs做文件集成,看代码node2build.jsvarfs=require('fs')varcp=require('child_process')var__config__=require('./../dist/config')varfromdir=(process.argv.length>=3?process.argv[2]?process.argv[2]:'':'dist')vartodir=(process.argv.length>=4?process.argv[3]?process.argv[3]:'':'pack')varbase={appDir:'../'+fromdir,baseUrl:'./',dir:'../'+todir,//fileExclusionRegExp:"^*\.less$",removeCombined:true,optimize:'uglify2',//uglify:{ascii_only:true,beautify:true,preserveComments:false},//uglify2:{输出:{ascii_only:true,beautify:false,comments://false}},optimizeCss:'standard',//“standard”,paths:{'libs':'libs','vue':'libs/vue/vue','vuex':'libs/vuex/vuex','vue-router':'libs/vue-router/vue-router','vue-popup':'libs/vue-popup/index','jquery':'libs/jquery/jquery','fastclick':'libs/fastclick/fastclick','wind-dom':'libs/wind-dom/index','__module__':'common/__module__','__component__':'common/__component__','__install__':'common/__install__','__store__factory__':'common/__store__factory__','detector':'common/detector','calc':'common/calculate','emitter':'common/mixins/emitter','clickoutside':'common/utils/clickoutside','isvisible':'common/utils/isvisible','install':'components/install'},map:{'*':{'text':'libs/require-text/text'}},模块:[{name:'entrance',include:['__module__','__store__factory__','libs/es6-promise/promise','jquery','vue','vue-router','detector','calc','fastclick','libs/require-text/text','store/transition'],排除:['store/index','router/index']}]}//这里是通过配置文件拼装配置信息,并用同步集base.modules[0].include=base.modules[0].include.concat(__config__.modules.filter(o=>o.store).map(o=>{return'store/modules/'+o.path+'/store'}))base.modules[0].include=base.modules[0].include.concat(__config__.modules.filter(o=>o.sync).map(o=>{return'business/'+o.path+'/index'}))base.modules[0].include=base.modules[0].include.concat(__config__.modules.filter(o=>o.sync).map(o=>{return'libs/require-text/text!business/'+o.path+'/tpl.html'}))fs.writeFileSync('build/b.js','('+JSON.stringify(base)+')')varspawn=cp.spawnvarexec=cp.exec//这里是通??过控制台执行r.js的打包命令node2build=spawn('node',['node_modules/requirejs/bin/r.js','-o','build/b.js'])node2build.stdout.on('data',function(data){console.log(''+data)})node2build.stderr.on('data',function(data){console.log(''+data)})//这里是控制台执行完成后的文件合并处理node2build.on('exit',function(code,signal){fs.unlinkSync('build/b.js')//合并代码var入口=fs.readFileSync(todir+'/entrance.js','utf-8')varrouter=fs.readFileSync(todir+'/router/index.js','utf-8')router=router.replace(/(define\()(e,function)/,'$1"router/index",$2')varstore=fs.readFileSync(todir+'/store/index.js','utf-8')store=store.replace(/(define\()(e,function)/,'$1"store/index",$2')//合并路由和store入口=entrance.replace(/(define\(["']application["'])/,router+store+'$1')//将配置文件放在文件头varconfig=fs.readFileSync(todir+'/config.js','utf-8')entry=config+entry//删除文件exec('rm-rf'+todir+'/store')exec('rm-rf'+todir+'/router')exec('rm-rf'+todir+'/components')exec('rm'+todir+'/build.txt')exec('rm'+todir+'/config.js')fs.writeFileSync(todir+'/entrance.js',入口)//处理html并删除co??nfig.js的引入varhtml=fs.readFileSync(todir+'/index.html','utf-8')html=html.replace('\r\n','')fs.writeFileSync(todir+'/index.html',html)console.log(`打包完成(返回码:${code})`)})有问题可以留言问,找到了有用,收藏一下
