SPA(单页面架构)方案目前很流行,但是大部分网站还是选择多页面或者单页面+多页面混合架构。本文使用express和webpack,低成本实现了多页面架构、自动刷新、前后端分离等概念。一、项目gitreponode-pages-webpack-hotdevelopmentnpminstallnpminstallsupervisor-gnpmrunstart#开发环境,配置hotreloadnpmrunprod#生产环境npmrunbuild#编译前端生产环境DEMOFE目录:SERVER目录:为了不浪费大家的时间,阅读以下内容需要有express的基础知识,以及对node的简单了解和对webpack的中级了解,本文使用webpack2实现1.FE端配置.前端配置需要实现的功能点:多页面架构自动生成入口,通过html-webpack-plugin为每个页面生成模板,选择任意模板引擎需要实现布局模板功能(本文使用swig作为模板引擎)配置各种文件后缀的加载器,使用HotModuleReplacementPlugin实现自刷新1.1自动解析入口规定每个页面必须有一个与本页入口同名的js文件,目录深度可变,如下图,分解为两个entry:为了实现自动获取,使用glob获取所有.js文件,判断是否有同名的.html,如果有,则生成一个entry,如果这是一个开发环境,添加更多hotMiddlewareScript模块//获取所有js文件letfiles=glob.sync(config.src+'/**/*.js');让srcLength=config.src.length;让条目={};files.forEach(function(_file){letfile=path.parse(_file);lethtmlFile=path.resolve(file.dir,file.name+'.'+config.ext);//如果有同名模板文件,它是一个条目if(fs.existsSync(htmlFile)){letpathIndex=file.dir.indexOf(config.src);if(config.dev=='dev'){entries[config.staticRoot+file.dir.slice(srcLength)+'/'+file.name]=[path.resolve(_file),hotMiddlewareScript];}else{entries[config.staticRoot+file.dir.slice(srcLength)+'/'+file.name]=path.resolve(_file);}}});返回条目;1.2自动生成html-webpack-plugin模板生成一系列HtmlWebpackPlugin的要点如下:获取所有.html后,判断是否有对应的入口文件,有则创建HtmlWebpackPlugin如果页面为布局模板,则需要注入更多CommonsChunkPlugin生成的通用模块自动生成HtmlWebpackPlugin代码如下:lethtmls=[];//获取所有模板letfiles=glob.sync(config.src+'/**/*.'+config.ext);让srcLength=config.src.length;files.forEach(function(_file){letfile=path.parse(_file);letchunks=[];letchunkName=config.staticRoot+file.dir.slice(srcLength)+'/'+file.name;//如果有同名条目,创建一个html插件letc=entrys[chunkName];c&&chunks.push(块名);//布局将包含公共块if(file.name==config.serverLayoutName){chunks.push(config.staticRoot+'/common');}letplugin=newHtmlWebpackPlugin({filename:config.templateRoot+file.dir.slice(srcLength)+'/'+file.base,template:path.resolve(file.dir,file.base),chunks:chunks,注入:假});htmls.push(插件);});返回html;由于引入了templateextendssupport,需要设置inject=false,这样assets文件就不会被自动注入。写一个webpack插件,将页面的js资源和css资源注入:两个替换文案地方,比如页面模板:{%extends'../base/base.html'%}{%blocktitle%}MyPage{%endblock%}{%blockstyle%}{%endblock%}{%blockhead%}{%parent%}{%endblock%}{%blockcontent%}
这只是一个主页!!!