前端引用公共html模块方案探索

最近临时一个负责公司官网的妹纸请假,于是临时接手了下官网的项目,官网都是静态页面,算是很简单的,但发现页面挺多,而每个页面总有部分是和其他页面一模一样的,比如页头、页尾等,这样就导致一个地方的修改要在其他N个页面手动重复的改下,当然,这是我无法忍受的,于是思考下怎样将公用的部分独立出来供调用。

开始想直接用js异步请求一个公用模块的页面即可,但考虑到官网的SEO问题,就放弃了,接着就想能否用webpack将代码分为开发环境和生产环境,在开发环境进行页面的拼接,完成后输出到生产环境,这样就不会影响seo,同时还能借助webpack的强大打包功能将资源进行打包压缩等处理,下面简要阐述demo的搭建。

demo的整体结构如下:

 1 base-config
 2     --webpack.dir-foreach.config.js
 3 css
 4 images
 5 js
 6 lib
 7 publicLayout     --main.js
 8 publish
 9 templateSource    --commonhtml    --course     --course.ejs     --course.js    --index     --index.ejs     --index.js    .........
10 package.json
11 webpack.build.config.js
12 webpack.config.js

主要的构建模块实在publicLayout和templateSource两个目录:

publicLayout: 主要封装公共模块的引用模块,main.js代码如下:

1 const header = require(‘../templateSource/commonhtml/header.html‘);  //引入公共页面头
2 const topbar = require(‘../templateSource/commonhtml/topbar.html‘);  //引入body中存在的公共模块
3 const footer = require(‘../templateSource/commonhtml/footer.html‘);  //引入公页面脚
4 const htmlconfig = {
5     header: header,
6     topbar: topbar,
7     footer: footer
8 };
9 module.exports = htmlconfig;  //导出供调用

templateSource: 存放页面的构建模板,此demo中采用ejs作为前端模板,如index页,由index.ejs生成:

 1 <%= header %>
 2     <link type="text/css" rel="stylesheet" href="css/course.css">
 3 </head>
 4 <body>
 7     <div class="nav-bar">
 9         <div class="nav">
10             <ul class="navigation">
11                 <li>
12                     <a href="index.html" target="_self" title="">首页</a>
13                 </li>
14                 <li>
15                     <a href="course.html" target="_self" title="" class="cur">课程定制</a>
16                 </li>
17                 ......
18             </ul>
20         </div>
22     </div>
24     <!-- wrapper -->
25     <div id="container">
26         <div>主内容部分1</div>
27         <%= topbar %>
28         <div>主内容部分2</div>
29     </div>
30     <!-- footer -->
31     <%= footer %>
32 </body>
33 </html>
<%= header %>即是引入main.js中封装的公共头部分,与当前的html完成拼接,最终输出到发布环境(publish)中。index.js代码如下:
1 const publiclayout = require(‘../../publicLayout/main.js‘);  //总是引入封装的页面公共部分
2 const mainindex = require(‘./index.ejs‘);  //引入当前页的模板模块
3 module.exports = mainindex(publiclayout);  //将公共部分的多个变量导出到页面模板中进行页面拼接

整个demo相对简单,仅仅是为了规避在多个页面中修改同一处的重复劳动这一痛点。

GitHub:https://github.com/frankshin/public-html-layout

时间: 2024-10-17 06:20:59

前端引用公共html模块方案探索的相关文章

【转】前端工程化-公共模块的依赖和常用的工作流

题记: 一个人的项目,还有工程化的问题嘛? 我们在推进模块化和组件化的过程中,肯定会不断的沉淀出我们项目的模块和组件.对于这些沉淀出的模块和组件怎么管理?另外怎么依赖也是个问题? 你真的想这样嘛? var BreadCrumb = require(‘../../../../uikit/breadcrumb’); //真心ugly. 之前也尝试了很多的不同的解决方案,最终发现npm2.0的local module是最简单的,而且最符合模块化思维,我们可以把我们的模块按照功能进行划分. 比如: ui

Ring3 下 API Inline Hook 优化方案探索与实现

??本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/51302024 ?? 以前写过两篇"[Win32] API Hook(1)在32/64位系统上的实现"博客,介绍并给出了 API inline hook 代码,如下: ????blog.csdn.net/zuishikonghuan/article/details/47

【直接拿来用のandroid公共代码模块解析与分享】の Notification和NotificationManager

本文源代码托管在https://github.com/ASCE1885/asce-common,欢迎fork Android项目做得多了.会发现原来非常多基础的东西都是能够复用,这个系列介绍一些自己项目中经常使用到的公共模块代码(当然仅仅谈技术不谈业务),一来整理好了自己以后能够直接用,二来也分享给大家,希望能略微降低大家的加班时间,提高些许效率. Android Notification的原理和作用这里就不作说明了,相信是个android开发人员都用过不止一次了,下面仅仅介绍怎样封装成公共的模

开源jms服务ActiveMQ的负载均衡+高可用部署方案探索

一个文件(或目录)拥有若干个属性,包括(r/w/x)等基本属性,以及是否为目录(d)与文件(-)或连接文件(l)等属性.此外,Linux还可以设置其他系统安全属性,使用chattr来设置,以lsattr来查看,最重要的是可以设置其不可修改的特性,即便是文件的拥有者都不能进行修改.这个属性相当重要,尤其是在安全机制方面(security). 文件默认权限:umask 当建立一个新的文件或目录时,它的默认属性是与umask有关的.通常,umask就是指定当前用户在建立文件或目录时的属性默认值.那么,

python3 中引用 HTMLTestRunner.py 模块的注意事项

HTMLTestRunner.py支持python2中运行,如果在python3.6.2中引用HTMLTestRunner.py模块,需要做一下更改: 1.更改HTMLTestRunner.py模块中的代码 1.更改StringIO模块导入方式:  2.self.outputBuffer=StringIO.StringIO()  改为self.outputBuffer= StringIO() 3.python3.6.2字典无has_key方法: 4.str没有decode方法,去掉decode转

jenkins+gitlab自动化编译部署方案探索及服务端编译webpack实战

一. 背景 之前我们的开发流程为在本地进行webpack打包编译,然后svn提交源代码和编译后的代码.同时每次提交前也会从svn更新源代码和编译后的代码.这样做有几个缺点: 1. svn 更新和提交编译后的代码造成大量冲突文件 2. 由于我们使用非覆盖式发布的命名方式,在经过小组多人多次优化提交测试之后,在整理需要发布的文件列表时,很容易遗漏一些文件 3. 在涉及到多人开发同一功能时容易产生代码被覆盖.人工安排发布优先级.手动注释他人未上线代码等情况 4. svn的分支开发繁琐不友好,加重工作量

如何抽离、引用公共部分页面

如何抽离.引用公共部分页面 如何抽离.引用公共部分页面.产生背景:最近,需要新开发一个jq官网项目.在做项目的时候经常会遇到一样的头部和底部,如果每个页面都复制一遍,不仅工作量大而且万一需要修改一下文章就更麻烦了,这时候就需要我们把公共部分提取出来,等需要的时候再引入页面.所以先考虑做的抽离页面,然后引用,这样可以自由拼凑,方便复用. 页面抽离及引入:使用jQ的load函数(公司项目一直用的JQ,出于兼容性原因) <!--在引入页面--> <div class="footer&

Vuex的this.$store.commit和在Vue项目中引用公共方法

2018年11月22日 20:50:29 Funfction_Zero 阅读数 3230 1.在Vue项目中引用公共方法 作为一个新人小白,在使用vue的过程中,难免会遇到很多的问题,比如某个方法在很多组件中都能用的上,如果在每个组件上都去引用一次的话,会比较麻烦,增加代码量.怎么做比较好呢,话不多说直接看代码把 首先 要在main.js中引入公共js.然后,将方法赋在Vue的原型链上.像图中这样. 然后在需要的组件上去引入这个方法 mouted (){ //调用方法 this.common.l

微信小程序引用外部js,引用外部样式,引用公共页面模板

https://blog.csdn.net/smartsmile2012/article/details/83414642 ================小程序引用外部js====================== //封装的函数function GetUserInfo2018() { console.log("获取用户信息8888")} function count(str) { console.log(str)} //转化成小程序模板语言 这一步非常重要 不然无法正确调用mod