GitChat · 前端 | JavaScript 进阶之 Vue.js + Node.js 入门实战开发

GitChat 作者:小青年
原文:JavaScript 进阶之 Vue.js + Node.js 入门实战开发
关注公众号:GitChat 技术杂谈,一本正经的讲技术

前言

随着前端技术的快速迭代,JavaScript 的关注度越来越高,相关的生态链和前后端分离的解决方案愈趋完善,JavaScript 发挥着越来越重要的作用。Vue.js 的火热程度丝毫不亚于曾经的 jQuery,相关的生态也发展得越来越好。Node.js 经过这么多年的发展也越来越强大,虽然 Node.js 在短期内不会取代基于 Java 、PHP 等传统的后端语言,然而 Node.js 已经被越来越多的人用于项目开发中。基于这种考虑,数月前我打算搞点事情,尝试做一个 Vue.js + Node.js 全栈开发社区,专注于探索和分享 Vue.js 和 Node.js 开发的相关技术。之前申请的 vuenode.com 域名备案上个月通过了,于是开始实施了,本次 Chat 作为一个入门级别的总结,将以构建一个简单的技术博客系统为例,说明 Vue.js 结合 Node.js 实战的例子帮助前端新人进阶学习,掌握后端必备的一些基础技能。本文的主要内容包括:

  • Vue.js / vue-router / vuex 基本用法;

  • Vue 的 PWA的解决方案 Lavas 介绍;

  • Node.js 框架 Egg.js 的基本用法;

  • Linux 云服务器搭建部署 Node 服务。

Vue.js / vue-router / vuex 基本用法

Vue.js 的核心特征

学习一种新技术我们首先需要抓住主要内容,其他的工作无非是一些需要反复去研读文档去实践验证的细节。学习 Vue.js 我不建议新手直接用 Vue Cli 跑单文件组件工程,虽然这样可以很快写出一个简单项目的原型,但是通过简单的demo学习,更能够理解问题的本质。

响应式系统

在上一期的讲座中我们学习了Vue.js数据双向绑定的实现原理,其主要特性是一种基于数据驱动的思想构成的响应式系统,模型层(model)只是普通 JavaScript 对象,修改它则更新视图(view)。这是需要去重点关注的第一个重点,与之相关的知识点是生命周期模板语法插值指令过滤器)等。这部分的内容基本上是需要我们对于数据绑定相关的内容有一定的理解。

看到很多人在写 Vue.js 的时候依然还是之前DOM操作的一些思想,先入为主的一定要拿到需要控制的对象进行操作,而不是想着我们的数据模型是响应式的,通过改变数据模型,视图会自动变动。改变思想才能更好的利用工具,以数据和状态为中心,在某些场合下可能比对象事件更简单。

这部分的内容基本上以文档为主,本文不作赘述。

组件化系统

用官方文档的话说就是,组件(Component)是 Vue.js 最强大的功能之一,组件可以扩展 HTML 元素,封装可重用的代码,在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能,在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展。

要想理解组件化的意义,我觉得有必要了解一下 Web Components 标准,Web Components 由这四种技术组成:

  • 自定义元素 (Custom Elements)

  • HTML模板 (HTML Templates)

  • 影子DOM (Shadow DOM)

  • HTML导入 (HTML Imports)

为了深入理解 Vue.js 背后设计的思想,我们先通过一个自定义 Dialog 的实例看看 Web Components 如何使用。我们想实现通过调用自定义元素的形式调用我们自定义的dialog组件。

web 开发中需要解决的经典问题——封装。如何保护组件的样式不被外部 css 样式侵入,如何保护组件的 dom 结构不被页面的其他 javascript 脚本修改。

那么如何实现呢?首先我们需要理解几个基本概念。

Shadow DOM

Shadow DOM 很好的解决了这个问题,我们通过 Element.createShadowRoot()
为自定义元素创造一个”隔离区间”,浏览器渲染显示结果如下图:

显示 shadow dom 需要开启 Chrome 开发者工具的 ‘Show user agent shadow DOM’ :

HTML Templates

以前我们写 html 模板一般会写在script元素或者textarea元素中,比如原来的模板形式:

<script type="text/template">
    
this is your template content. </div> script>

而现在我们可以直接使用语义化更好的template元素,我们可以通过 content 属性访问 template 标签的内容。

<template id="dialog-template">
  <style>
    /* web-components-dialog style */
  style>

  <div class="web-components-dialog-mask">
    <div class="web-components-dialog-wrapper">
      <div class="web-components-dialog">
        <div class="web-components-dialog-title">div>
        <div class="web-components-dialog-content">div>
        <div class="web-components-dialog-btns">div>
      div>
    div>
  div>
template>

读取模板内容:

 var template = document.querySelector('#dialog-template').content;

template 元素主要有四个特性:

  • 惰性:在使用前不会被渲染;

  • 无副作用:在使用前,模板内部的各种脚本不会运行、图像不会加载等;

  • 内容不可见:模板的内容不存在于文档中,使用选择器无法获取;

  • 可被放置于任意位置:即使是 HTML 解析器不允许出现的位置,例如作为