一. 概述
在目前的互联网大环境下,如果只有一门技术傍身,不足以胜任市场对研发的要求,于是想学习大前端技术栈。笔者接触前端是从开发微信小程序开始的,它的数据双向绑定机制,让写习惯了客户端的我叹为观止。目前我入门前端的技术路径是:客户端—微信小程序—混合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/