fayeah / blogs

方法论、问题驱动、总结
6 stars 0 forks source link

我用Vanilla JS重写了一遍项目,结果…… #49

Open fayeah opened 3 years ago

fayeah commented 3 years ago

背景

上次听Dan大师的Live嘛,然后其中他提到怎么提高自己的技术,使用原生JS做东西,比如游戏之类的,那我不玩游戏,就很奇葩地想到用原生JS重写一下我的一个项目……然后我整个人就不好了😅

构思

如果要开启一个新的项目,那么准备阶段要做些啥呢?可能是要想想实现哪些功能了,我现在主要目的是练习JS以及代码设计,那么对于浏览器兼容,如何打包这些话题没有在我考虑的范围内,那我一开始能想到的如下List,如果有后续的补充,再慢慢添加(当然我并没有做完!😔):

学习

我虽然有自己大概的一个想法,但也想看看别人是如何使用纯JS来做一个应用的,有的人就真的是标题党,看着是Venila JS,内容却用了bootstrap, jQuery等等的工具。找了一些,但基本上都是非常简单的小项目,从创建main.js和index.html开始,没有一个系统的工程的例子,还是得靠自己摸索。

搭建

因为是纯JS,所以搭建起来比较容易,可参考一下步骤:

  1. 创建一个index.html文件,用于写静态页面;
  2. 创建一个main.js文件,用来写JS代码,并引入到已创建好的index.html文件中;
  3. 全局安装live-server,用于hot reload页面;
  4. OK,到这里基本就搭建完成,那么第一步我想到的是先做一个布局,包括navigator、header和content三个部分,并且navigator支持收缩。

Layout

想看下效果吧:

venilla-js.gif

其实是一个非常简单的布局,闭着眼睛都能实现的那种,看下我的代码片段:

<div id='root'>
    <nav class="left">
      <div class="logo"><i class="fab fa-vine"></i></div>
      <div class="menu">
        <script src="../components/menu.js" type="module"></script>
      </div>
    </nav>
    <div class="right">
      <header class="header">
        <img src="../assets/dedent.svg" alt="dedent" class="dedent-icon" />
        <div class="user">user</div>
      </header>
      <main id="content" class="content"></main>
    </div>
  </div>

由于用到的font-icon图标,需要在header里面引入响应的cdn链接。从这一小段代码里面我学到了哪些呢:

Router

路由的实现基本上是使用了history这个方法,核心代码如下:

const onNavigate = pathname => {
  const contentDiv = document.getElementById('content');
  window.history.pushState(
    {},
    pathname,
    window.location.origin + pathname
  )
  contentDiv.innerHTML = routes[pathname]
}

简单来说,就是将路由对应的页面嵌入到id为content的div(在index.html)中。

实现了路由之后,我已经要放弃了,太繁琐了,全部的功能都要手动撸出来,要说收获嘛,那肯定是有的,readme里面解释了我的一些笔记以、源码和相关参考资料。感兴趣的前往这里👉:https://github.com/fayeah/venilla-js

感谢大家阅读,欢迎交流😃。