一. 概述
在目前的互联网大环境下,如果只有一门技术傍身,不足以胜任市场对研发的要求,于是想学习大前端技术栈。笔者接触前端是从开发微信小程序开始的,它的数据双向绑定机制,让写习惯了客户端的我叹为观止。目前我入门前端的技术路径是:客户端—微信小程序—混合AppH5开发—Web前端。一些我自己的经验总结出来,希望对你有所帮助。当然阅读这篇文章的前提是,你已经了解了基本的Html、CSS、JS语法。
二. 环境与工具
1. 前端环境搭建
 笔者使用的Mac电脑,所有的环境搭建工作都是基于Mac电脑来操作的。首先安装node.js与npm: 
node.js
node 是一个基于 V8 引擎的 Javascript 运行环境,它使得 Javascript 可以运行在服务端,直接与操作系统进行交互,与文件控制、网络交互、进程控制等。简单的说node.js就是运行在服务端的 JavaScript。你可能会有疑问,我写前端页面为甚么需要一个运行在服务端的的JS环境。其实我们这里使用node最关键是需要安装npm. 
npm
npm是node.js的包管理工具(package manager),为啥我们需要一个包管理工具呢?因为我们在Web开发时,会用到很多别人写的JavaScript代码。如果我们要使用别人写的某个包,每次都根据名称搜索一下官方网站,下载代码、解压、再使用,非常繁琐。于是一个集中管理的工具应运而生:大家都把自己开发的模块打包后放到npm官网上,如果要使用,直接通过npm安装就可以直接用。他类似于iOS开发中的Cocoapods,Android开发中的Maven,这样就好理解了。node下载地址点击这里,按照步骤安装完成后,终端输入
1  | node -v  | 
查看安装版本,出现下面的版本号说明安装成功。
注意如果提示
-bash: node: command not found,说明还需要配置一下环境变量。配置方式也很简单,在Finder中查找文件夹,输入路径/private/etc,找到profile文件,加上一下语句

1  | export NODE_HOME="node安装路径(bin路径的父级路径)"  | 
node安装路径(bin路径的父级路径):你可以通过命令which node 命令来查看。例如我的本地路径是/usr/local/bin/node,那么可以这样设置
1  | export NODE_HOME="/usr/local"  | 
重新保存文件后,再次输入node -v 验证一下。下面是一些npm常用命令:
1  | // 本地安装模块  | 
yarn:
yarn是一个由 Facebook 贡献的 Javascript 包管理器。yarn是为了弥补npm的一些缺陷而出现的。在日常开发中你可以使用npm也可以使用yarn进行包的管理,只不过相比npm而言,它的速度更快,并提供了离线模式。关于它我们不会过多的介绍,你可以去它的中文网站查看.它的安装方式也很简单,直接通过Homebrew进行安装,命令 brew install yarn. 它的一些常用指令:
1  | // 初始化一个新项目  | 
可以在项目中混用
yarn与npm,但是最好不要这样。
2. 开发工具选择

前端的开发工具基本就两个选择Visual Studio Code 或者 WebStorm,两者选择哪一个都可以,我个人更喜欢Visual Studio Code,其实选择它最主要原因是免费且开源,而且有强大的插件库。
VSCode安装插件:
选择[扩展]-[搜索插件]-安装即可
下面是我使用的一些常用的VSCode插件:
(1) vue vscode snippets
它是Vue项目代码的骨架插件,例如输入vbase,会直接生成以下代码
1  | <template>  | 
相似的还有vdata、vmethod、vfor等操作
(2) Auto Close Tag 自动闭合HTML标签
(3) Auto Rename Tag 修改HTML标签时,自动修改匹配的标签
(4) Color Highlight 颜色值在代码中高亮显示
(5) HTML CSS Class Completion CSS class提示插件
(6) Vetur Vue多功能集成插件,包括:语法高亮,智能提示,emmet,错误提示,格式化,自动补全,debugger。vscode官方钦定Vue插件,Vue开发者必备
(7) VSCode-icons 文件图标,方便定位文件
(8) Color Highlight 颜色值在代码中高亮显示
(9) HTML CSS Support 智能提示CSS类名以及id
(10) Beautify 格式化代码工具,美化javascript,JSON,CSS,Sass,和HTML
(11) Open in Browser 直接在浏览器中打开你当前的文件
三.Vue项目搭建与开发事项
目前前端几大主流框架React、Vue、Angular,三个框架各有优劣,个人感觉Vue的入门难度最小,而且有良好的中文教程和广泛的第三方支持,如果要入门前端技术,从Vue入手是比较明智的。
1.Vue项目搭建
 使用Vue CLI脚手架构建Vue项目
(1). 使用 npm 或 yarn 全局安装 Vue CLI
1  | npm install -g @vue/cli  | 
如果页面报错如下
说明执行权限不够,可以在在前面加sudo
1  | sudo npm install -g @vue/cli  | 
执行完成后输入命令vue -V查看Vue/Cli 版本,出现如下提示说明安装成功。
(2). 在工程所在目录创建项目
执行以下命令
1  | vue create my-project  | 
vue create是使用命令行创建项目,vue ui是以图形化界面创建和管理项目。
(3). 配置工程
输入创建命令后提示:
此时会判断你的npm/yarn源的连接速度,询问你是否切换至淘宝镜像,我们输入n,继续

提示:项目是使用默认配置(Vue2还是Vue3 都包含babel, eslint)还是手动选择,我们选择手动配置,继续

- Choose Vue version: 选择Vue的版本 选择
 - Babel :将脚手架中浏览器不认识的一切东西翻译为浏览器认识的 选择
 - TypeScript : 强类型的 JaveScript
 - Progressive Web App (PWA) Support : 渐进式App,主要用于兼容移动端
 - Router : Vue 路由管理 选择
 - Vuex: Vue的状态管理器 选择
 - CSS Pre-processors : CSS 预处理器,可选择使用 less、sass、stylus等预处理器 选择
 - Linter / Formatter :代码检测和格式化
 - Unit Testing: 单元测试
 - E2E Testing: 端到端测试
选中好后继续按方向键是进行上下移动,空格是选中/取消,回车是确定当前所选内容,继续下一步操作
 

提示:选择Vue版本,我们选择Vue3版本,继续

提示:路由方式是否使用history模式。一般都是单页面开发不选择history,输入n继续

提示:选择CSS预处理器
- node-sass 是自动编译,实时的
 - dart-sass 需要保存后才会生效
 - Less 最终会通过编译处理输出css到浏览器,Less 既可以在客户端上运行,也可在服务端运行 (借助 node.js)
 - Stylus 主要用来给
node项目进行CSS预处理支持,Stylus功能上更为强壮,和Js联系更加紧密,可创建健壮的、动态的的CSS 
我们选择 Sass/SCSS (with node-sass),继续

提示:Babel, ESLint是使用独立文件,还是在package.json一个文件中保存所有配置信息。选择第一个,继续

提示:是否为以后创建的项目保存我们当前所选的这些配置,我们选择否,开始自动创建项目

项目创建完成后,cd到当前工程目录下,执行yarn serve,就可以运行当前项目了。

在浏览器中输入上面的地址就可看到我们当前创建的Vue工程了

2.Vue基础语法
(1).Vue的基础语法
Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统:About.vue
1  | <template>  | 
TodoItem.vue
1  | <template>  | 
- Vue 框架将data中的数据和 DOM 进行了关联,所有内容都是响应式的。改变data中返回对象的数据,可以直接在Dom中进行响应。
 - 为了让用户和应用进行交互,我们可以用 
v-on指令添加一个事件监听器,通过它调用在实例中定义的方法,指令v-on可以简写为@。 - 使用
v-model指令,实现表单输入和应用状态之间的双向绑定。 - 控制一个元素是否显示使用
v-if指令,他可以配合v-else使用,也可以使用v-show指令来控制元素是否显示。 v-for指令可以绑定数组的数据,来渲染一个项目列表.使用v-for指令必须设置其key值。以上只是最基本的
Vue语法简介,其他语法比如:组件的生命周期、组件之间的数据传递、事件监听、插槽、动态组件&异步组件、组合式API(setup)的使用等等,需要你去学习官方Vue文档
(2).Vue Router的使用
Vue Router 是 Vue.js 的官方路由。它与Vue.js核心深度集成,让用Vue.js构建单页应用变得轻而易举。
安装
1  | npm install vue-router@4  | 
使用main.js中挂载router
1  | import { createApp } from 'vue';  | 
router/index.js中调用createRouter()
1  | import { createRouter, createWebHistory } from 'vue-router';  | 
App.vue
1  | <template>  | 
- 通过调用 
app.use(router),我们可以在任意组件中以this.$router的形式访问它,并且以this.$route的形式访问当前路由 - 我们可以在Dom中使用
<router-link to="/" />来执行导航跳转,也可以使用编程式导航,router-view将显示与 url 对应的组件。你可以把它放在任何地方,以适应你的布局。 - 嵌套路由也是我们经常使用的方式,例如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21const routes = [
{
path: '/detail/:userId',
name: 'Detail',
component: () => import(/* webpackChunkName: "about" */ '../views/Detail.vue'),
children: [
{ // 默认显示
path: '',
component: Profile,
},
{
path: 'profile',
component: Profile,
},
{
path: 'posts',
component: Posts,
},
],
},
]Detail.vue 
1  | <div>  | 
跳转到Detail页面
1  | const userId = '1001';  | 
上面的例子中,首先使用了动态路由匹配功能,传递参数userId,此时的路径为/detail/1001,默认展示Profile组件,在Detail页面有两个子路由:Profile和Posts,当点击Link标签时,匹配路径为/detail/1001/profile时候展示Profile,当匹配路径为/detail/1001/posts,展示posts组件,设置path: '',表示进入/detail/userId页面默认显示的组件。
- 如果你想同时在
Detail中显示Profile和Posts两个组件,可以使用命名视图,它主要用于同时 (同级) 展示多个视图,而不是嵌套展示。 
Detail.vue
1  | <div>  | 
router.js
1  | const routes = [  | 
- **在 Vue 实例中,你可以通过 
$router访问路由实例。因此你可以调用this.$router.push()**,当你点击<router-link>时,内部会调用这个方法,所以点击<router-link :to="...">相当于调用router.push(...)。 - 其他语法比如:路由组件传参、导航守卫、过渡动效等,需要你去学习官方Vue Router文档
 
(3).Vuex的使用
Vuex是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。它主要用来解决多个组件共享状态的问题。

Vuex 跟 Redux的数据管理模式很相似,如果理解Redux,那么Vuex也很容易理解了,只不过Vuex 是专门为 Vue.js 设计的状态管理库,使用起来要更加方便。
安装
1
2
3npm install vuex@next --save
OR
yarn add vuex@next --save核心概念
State: 就是组件所依赖的状态对象。我们可以在里面定义我们组件所依赖的数据。可以在Vue组件中通过this.$store.state.XXX获取state里面的数据.Getter:从store中的state中派生出一些状态,可以把他理解为是store的计算属性.1
2
3
4
5
6
7
8
9
10
11
12
13const store = createStore({
state: {
todos: [
{ id: 1, text: '...', done: true },
{ id: 2, text: '...', done: false }
]
},
getters: {
doneTodos: (state) => {
return state.todos.filter(todo => todo.done)
}
}
})例如我们定义了上面的store,在Vue组价中通过
store.getters.doneTodos访问它的getter.Mutation:更改 Vuex 的 store 中状态的唯一方法是提交 mutation,我们通过在mutation中定义方法来改变state里面的数据。1
2
3
4
5
6
7
8
9
10
11const store = createStore({
state: {
count: 1
},
mutations: {
increment (state) {
// 变更状态
state.count++
}
}
})在Vue组件中,我们通过
store.commit('increment'),来提交。需要注意的是,Mutation 必须是同步函数。在实际使用中我们一般使用常量替代 Mutation 事件类型。例如上面的例子1
2
3
4
5
6
7
8
9
10
11
12
13
14export const INCREMENT_MUTATION = 'INCREMENT_MUTATION'
const store = createStore({
state: {
count: 1
},
mutations: {
// 我们可以使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名
[INCREMENT_MUTATION] (state) {
// 变更状态
state.count++
}
}
})Action:Action 类似于 mutation,不同在于:- Action 提交的是 mutation,而不是直接变更状态。
 - Action 可以包含任意异步操作。
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17const store = createStore({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
},
actions: {
incrementAsync ({ commit }) {
setTimeout(() => {
commit('increment')
}, 1000)
}
}
})在组件中我们通过
store.dispatch('incrementAsync')触发action。Module: 当我们的应用较大时,为了避免所有状态会集中到一个比较大的对象中,Vuex 允许我们将 store 分割成模块(module)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18const moduleA = {
state: () => ({ ... }),
mutations: { ... },
actions: { ... },
getters: { ... }
}
const moduleB = {
state: () => ({ ... }),
mutations: { ... },
actions: { ... }
}
const store = createStore({
modules: {
a: moduleA,
b: moduleB
}
})
在Vue组件中我们使用store.state.a, store.state.b 来分别获取两个模块的状态.
更多关于Vuex的用法:辅助函数(mapState、mapGetters、mapMutations、mapActions)、命名空间、组合式API中调用等可以阅读[Vuex]文档.
3.第三方库使用总结
(1).移动Web布局库
我们在进行移动Web页面开发时,需要对页面进行布局,常用的布局方式有用rem来作单位,配合h5新的meta属性来适配屏幕做开发的,也有直接使用三方库postcss-px-to-viewport来进行页面布局的。我们直接使用第二种方式:
使用yarn进行安装,cd 到工程目录后执行
1  | $ yarn add -D postcss-px-to-viewport  | 
执行完成后,在postcss.config.js中进行参数配置
1  | module.exports = {  | 
(2). UI库

在进行移动Web开发中,第三方UI库的使用是少不了的,我们最常用的有vant、Element UI等,我们以vant来说明,进行工程目录执行
1  | # Vue 2 项目,安装 Vant 2:  | 
注意对于Vue2和Vue3项目引入方式是不一样的,我们是Vue3项目,因此执行
npm i vant@next -S或者yarn add vant@next
安装完成后就可以引入组件了,也需要注意,Vue2与Vue3的配置方式也是不同的,具体可以去查看Vant官网查看,这里不在赘述。
(3). 网络请求库
在项目中进行网络请求时,最常用的第三方库是axios,他的引入方式也很简单:
1  | $ npm install axios  | 
对于Vue2项目而言安装完成后在mian.js中引用axios,并绑到原型链上。
1  | import Vue from 'vue'  | 
它的用法很简单:
1  | // get请求  | 
但是对于Vue3项目而言,除了引入axios外,还需要引入vue-axios,引入方式:
1  | $ npm install --save axios vue-axios  | 
vue-axios是将axios集成到Vue.js的小包装器,可以像插件一样进行安装。在mian.js中引用axios,vue-axios,通过全局方法Vue.use()使用插件:
1  | import { createApp } from 'vue'  | 
使用方法:
1  | export default {  | 
(4).项目中的矢量图片使用
在开发项目时,免不了要使用到图片,目前项目常用的矢量图片库非阿里的iconfont莫属了,它最大的好处是你可以像调整文字一样,设置图片的颜色和大小,而不用担心图片失真问题。它的使用方式也很简单:
把我们要使用的图片添加到项目中,然后点击下载到本地
它有三种引入方式分别是:unicode 引用、font-class 引用、symbol 引用,我们只介绍symbol 引用,这也是官方最推荐的引用方式,相比前两种有如下特点:
- 支持多色图标了,不再受单色限制。
 - 通过一些技巧,支持像字体那样,通过font-size,color来调整样式。
 - 兼容性较差,支持 ie9+,及现代浏览器。
 - 浏览器渲染svg的性能一般,还不如png。
使用步骤如下: 
第一步:拷贝下载文件iconfont.js到项目目录
在需要用到iconfont 的地方引入这个js文件目录
1  | import '../utils/iconfont';  | 
第二步:加入通用css代码(引入一次就行)
1  | <style type="text/css">  | 
第三步:挑选相应图标并获取类名,应用于页面:
1  | <svg class="icon" aria-hidden="true">  | 
#icon-xxx就是你选的图片类名
如果要调整大小、颜色、位置等
1  | .icon {  | 
注意:加入的图片最好是去掉填充色的,然后你才能修改颜色,否则设置颜色不生效。
4.项目上线
开发完成后,需要将项目进行上线,我们知道,客户端开发完成后,将打包好的apk或ipa包发布到对应的平台就好了,前端开发完成后也需要将代码进行编译打包。执行命令:
1  | npm run build  | 
打包完成后,会在项目所在目录下生成dist文件夹,将其发给后端小伙伴就可以了。如果你没有配合的后端,或是想发布一个自己专属的网站,那么你大概需要以下步骤:
- 购买云端服务器(阿里云、腾讯云、华为云)
 - 对服务进行一些基本操作与 nginx 配置,可以参考:CentOS(7.6)基本操作与Nginx配置
 - 通过 
scp命令将dist文件夹上传到服务,完成后用服务IP可以访问到我们的网站了 - 购买域名(域名注册)
 - 对域名进行实名认证 +备案
 - 对域名进行解析 (IP 与 域名绑定) ,完成后通过域名可以访问到网站了
 - 借助CDN对网站访问速度进行加速
 
四.总结
做前端开发这段时间给我的感觉是,入门相对简单,但如果想精通,那确实需要认真学习不断沉淀。有时候接触的知识越多,越感觉自己的浅薄,这篇文章只是给想学习前端开发的同学一点思路,让你在学习繁杂的前端知识时不至于迷失方向。当然海量的知识这里是没涉及的,比如:Webpack原理、浏览器的基本工作原理、TypeScript、babel、Node.js、Web安全攻防、前端开发者必备的Nginx知识、Canvas API、SVG等绘制高性能的动画、虚拟Dom与Diff算法等等,只能说革命尚未成功,同志仍需努力啊!
参考:
Vue 中文文档
postcss-px-to-viewport
element UI
axios
iocnfont
https://v3.cn.vuejs.org/
https://cli.vuejs.org/zh/guide/