vue-cli3+typescript新建一个项目的思路分析


Posted in Javascript onAugust 06, 2019

最近在用vue搭一个后台管理的单页应用的demo,因为之前只用过vue-cli2+javascript进行开发,而vue-cli3早在去年8月就已经发布,并且对于typescript有了很好地支持。所以为了熟悉新技术,我选择使用vue-cli3+typescript进行新应用的开发。这里是新技术的学习记录。

初始化项目

卸载老版本脚手架,安装新版本脚手架后,开始初始化项目。初始化的命令跟2.x版本的略有不同,以前是 vue init webpack project-name ,而现在是 vue create project-name 。vue-cli3已经完全把webpack绑定了,这也就意味着无法像以前那样选择别的打包工具比如webpack-simple。如果一定要用webpack-simple,可以额外安装 @vue/cli-init ,可以在不卸载cli3的情况下使用init命令进行初始化。输入create命令后,可以选择初始配置。为了学习,我选择自定义,并把所有可选内容都勾选上。其余配置项基本就按默认的来,最终的配置情况如下。

? Please pick a preset: Manually select features
? Check the features needed for your project: (Press <space> to select, <a> to t
oggle all, <i> to invert selection)Babel, TS, PWA, Router, Vuex, CSS Pre-process
ors, Linter, Unit, E2E
? Use class-style component syntax? Yes
? Use Babel alongside TypeScript for auto-detected polyfills? Yes
? Use history mode for router? (Requires proper server setup for index fallback 
in production) No
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported 
by default): Sass/SCSS (with dart-sass)
? Pick a linter / formatter config: Basic
? Pick additional lint features: (Press <space> to select, <a> to toggle all, <i
> to invert selection)Lint on save
? Pick a unit testing solution: Jest
? Pick a E2E testing solution: Cypress
? Where do you prefer placing config for Babel, PostCSS, ESLint, etc.? In packag
e.json
? Save this as a preset for future projects? (y/N) n

然后需要一点时间来下载npm包,初始化完成后,看一下工程目录,可以看到跟vue-cli2的还是有很多不一样的地方。router和store都变成了单独的文件,而不是以前的文件夹,当然如果有需要的话可以自己建这两个文件夹。

最大的区别在于webpack配置都被隐藏起来了,默认没有了那些config文件,现在如果需要修改webpack配置项,可以在根目录新建一个 vue.config.js进行配置。这种的配制方法在2.x版本也可以用,内容也跟之前的类似。

module.exports = {
 baseUrl: '/',
 devServer: {
  before: app => {
  },
  proxy: {
   '/api': {
    target: 'http://api.com',
    changeOrigin: true
   }
  }
 },
 configureWebpack: {
  resolve: {
   alias: {
    'coms': '@/components'
   }
  }
 }
}

vue组件

项目初始化后的Home.vueHelloWorld.vue很好地举例说明了新的写法。

<!-- home.vue -->
<template>
 <div class="home">
  <HelloWorld msg="Welcome to Your Vue.js + TypeScript App"/>
 </div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import HelloWorld from '@/components/HelloWorld.vue'; // @ is an alias to /src
@Component({
 components: {
  HelloWorld,
 },
})
export default class Home extends Vue {}
</script>
<!-- helloworld.vue -->
<template>
 <div class="hello">
  <h1>{{ msg }}</h1>
 </div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
@Component
export default class HelloWorld extends Vue {
 @Prop() private msg!: string;
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="scss">
</style>

style 部分跟之前的并没有区别, template 部分的自定义组件变成了单标签的写法。最大的变化在于 script 部分。vue-cli3加入了更加流行的class写法,并且引入了许多面向对象语言(比如python)都有的装饰器。

装饰器其实是一个返回函数的高阶函数,接受一个函数对象作为参数,返回一个函数并赋值给原对象,它的作用主要是减少代码量。现在可以把组件的name和引用的别的component加到 @Component 后面,像Home.vue中那样。其他的方法和属性,可以直接写到class里面。因为是class的写法,所以也不需要 data(){return} ,可以直接写属性和方法。在写的时候,注意还有些地方会用到装饰器,常见的有 @Prop @Watch @Emit ,都需要单独引用。Prop在HelloWorld.vue中就有例子。Watch的使用如下

@Watch("page")
 onPageChanged(newValue: number) {
  //doSomething
 }

watch的对象是个字符串,后面跟着的就是watch的操作。这里的函数名并没有任何意义,只要不重复即可。

Emit的用法如下

@Emit('msg')
 dosomething() {
 }

另外计算属性的写法也有所不同,不再需要computed关键字,而是直接用get写法

get route() {
  return this.$route;
 }

至于生命周期钩子,则跟原来的都差不多。只不过写的时候,要注意typescript语法。在对象声明的时候,要加上 msg : string 类型标识。在有一些对象引用的地方,对于一些未知类型的引用,可以加上 (msg as any) 的标识。不加这些的话,会有错误提醒,但是不影响运行。

测试

todo

总结

以上所述是小编给大家介绍的vue-cli3+typescript新建一个项目的思路分析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
新页面打开实际尺寸的图片
Aug 25 Javascript
jquery键盘事件介绍
Jan 31 Javascript
使用jQuery时Form表单元素ID和name命名大忌
Mar 06 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
Aug 18 Javascript
如何在MVC应用程序中使用Jquery
Nov 17 Javascript
浅谈Javascript的静态属性和原型属性
May 07 Javascript
jquery中live()方法和bind()方法区别分析
Jun 23 Javascript
JavaScript之promise_动力节点Java学院整理
Jul 03 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
Aug 14 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
Sep 27 Javascript
推荐几个不错的console调试技巧实现
Dec 20 Javascript
解决新建一个vue项目过程中遇到的问题
Oct 22 Javascript
Vue 中可以定义组件模版的几种方式
Aug 06 #Javascript
angularjs请求数据的方法示例
Aug 06 #Javascript
通过js示例讲解时间复杂度与空间复杂度
Aug 06 #Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
Aug 06 #Javascript
JS中如何轻松遍历对象属性的方式总结
Aug 06 #Javascript
VUE组件中的 Drawer 抽屉实现代码
Aug 06 #Javascript
浅入深出Vue之自动化路由
Aug 06 #Javascript
You might like
php strtotime 函数UNIX时间戳
2009/01/14 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
详谈phpAdmin修改密码后拒绝访问的问题
2017/04/03 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
php判断目录存在的简单方法
2019/09/26 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
javascript 单选框,多选框美化代码
2008/08/01 Javascript
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
Python3编程实现获取阿里云ECS实例及监控的方法
2017/08/18 Python
python右对齐的实例方法
2020/07/05 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
三星英国官网:Samsung英国
2018/09/25 全球购物
金融专业应届生求职信
2013/11/02 职场文书
医学专业毕业生个人求职信
2013/12/25 职场文书
财务学生的职业生涯发展
2014/02/11 职场文书
大专学生求职信
2014/07/04 职场文书
15个值得收藏的JavaScript函数
2021/09/15 Javascript