仿掘金官网项目总结 | 青训营笔记

863 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第5天!

项目简介

因为这次大项目组队选择了官方组队的缘故,兜兜转转只剩下自己一个人做项目,又因为是刚刚学完vue毫无实战经历的小白,想着要锻炼一下自己,所以选择了用vue开发看上去最简单(一点也不)的仿掘金官网,主要目标是要实现主页面滚动加载,文章页面导航目录,代码高亮等功能,实现基本完整的文章浏览体验。

项目使用技术点

vue开发,vue-cli搭建,有用到vue路由和vuex,主要用到的插件有less(css预处理器),maven-editor(将md转换为html),Google Code Prettify(代码高亮)还有jQuery,整个过程下来确实体会到了vue的优势,文章页面直接渲染就行,整个页面也可以组件化,非常方便。

开发过程

1.思路

先做好主页面最上部的导航栏,通过路由切换导航栏页面,再完成下面的广告栏和文章栏,通过路由携带参数的方式访问特定文章。

2.遇到的问题

2.1样式与‘px’单位

本来以为写css写半天的时代已经远离自己了,没想到写主页面样式时困难重重,首先是动画实现的不好,经过半天钻研之后终于实现了几个比较简单的,但是相对困难的搜索框动画却一直没有头绪,其次是想要尝试用自适应单位,如:vw,但是也没有实现,还是用了‘px’

搜索框动画:
1.png 2.png

2.2文章数据存储

没有数据库,没有接口,尝试去找快速定制接口的网站/插件,也没有找到,最后只好把数据都放进了vuex,没想到还挺方便的。

3.png

2.3主页面滚动加载

刚开始想找一个滚动加载的插件,找了一圈感觉不如自己写,大概的思路是:先把所有文章数据赋值到一个数组,再把这个数组切成多份,每份十五个文章,每当监视到页面滑动到底部时便使用‘concat’追加渲染出新的‘一份’。

主要代码如下:

window.addEventListener('scroll', this.scrollFn)

    if (this.$store.state.database.length <= 15) {//文章数小于15则不用切分

      this.ArticleData = this.$store.state.database

    } else {//如果文章数大于15就切分

      for (let i = 0; i < this.$store.state.database.length / 15; i++) {//从vuex拿到文章数据

        obj[i] = this.$store.state.database.slice(15 * i, 15 * (i + 1))//切分

      }

      this.ArticleData = obj[0]

    }
scrollFn() {

      let windowHeight = window.innerHeight || document.documentElement.clientHeight

      let st = window.pageYOffset || document.documentElement.scrollTop

      let scrollHeight = document.documentElement.scrollHeight

      if (objKey === Object.keys(obj).length - 1) {

        return

      }

      if (windowHeight + st >= scrollHeight) {//如果滑动到了页面底部

        objKey++

        this.ArticleData = this.ArticleData.concat(obj[objKey])//追加文章数据

      }
2.4如何进入文章页面

最后的解决方案是进入文章页时携带'id'参数,再直接使用vuex文章数据找到对应的文章。

4.png

2.5将md转换为html

尝试了市面上的多个插件之后选择了maven-editor,它可以直接把加工好的md文档渲染到文章页面上,还有自动生成文章目录的功能,完全匹配我的要求,而且用法简单,美中不足是它的代码高亮效果失效了(猜想是它的代码高亮效果需要借助highlight.js,但是它的内部代码没有跟上highlight.js的更新),于是接着解决代码高亮的问题。

只需一行即可:

<mavonEditor class="article" v-model="content" defaultOpen="preview" :toolbarsFlag="false" :subfield="false" :navigation="true" :ishljs="false" />

2.6代码高亮

在maven-editor失效后尝试了多个代码高亮插件无果,主要是因为maven-editor就像一个黑盒子,很难在maven-editor做好一切的情况下去修改它内部渲染出的页面,幸好最后找到了Google Code Prettify,使用起来非常简单,仅需在代码所处的<code><code\>盒子加上对应类名(我用DOM来加类名)即可实现代码高亮。

for (let i = 0, len = codehl.length; i < len; i++) {

          codehl[i].setAttribute('class', 'prettyprint')

        }
2.7文章目录

虽然maven-editor自带文章目录,但是它给出的文章目录直接悬浮在了文章之上,而且样式也不尽人意,这里我另外自制了一个文章目录,通过jQuery获取到me生成目录内容,再渲染到我自制的目录上。

this.$nextTick(() => {

        const aArr = $('a').toArray()

        let toc = []

        let flag = true

        aArr.forEach(item => {

          let href = $(item).attr('id')

          let name = $(item).parent().text()

          if (href) {

            for (let i = 0, len = toc.length; i < len; i++) {

              if (toc[i].href == '#' + href) {

                flag = false

              }

            }

            if (flag) {

              toc.push({

                href: '#' + href,

                name

              })

            }

          }

        })

        this.toc = toc

      })

3.优化空间

(1)进入文章页面后需要自动刷新一次才能实现代码高亮效果,用户体验较差

(2) 搜索栏、文章目录等处缺乏动效

(3)md转HTML插件无法直接识别md文档中的换行,需要手动加‘\n’

(4)改进页面计量单位,使其在不同设备上显示效果相同

(5)进入文章页后需要点两次回退按钮才能回到首页(因为刷新过一次的缘故)

(6)页面改为可伸缩的

(7)代码冗余,许多应该分离的代码写到了一起

(8)文章页加载慢,性能尚待优化

总结思考

  • 基础还需要巩固
  • 编程思维还停留在以前,需要提高

整体来讲,虽然问题繁多,但这次项目是出乎我的意料的,进步很大,谢谢我,也谢谢青训营。