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 相关文章推荐
在网站上应该用的30个jQuery插件整理
Nov 03 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
Mar 30 Javascript
jQuery验证插件validate使用方法详解
Sep 13 Javascript
关于JavaScript数组你所不知道的3件事
Aug 24 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
Sep 29 Javascript
微信小程序 Flex布局详解
Oct 09 Javascript
js实现鼠标拖拽多选功能示例
Aug 01 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
Jul 30 Javascript
Vue全局分页组件的实现代码
Aug 10 Javascript
Vue动态加载异步组件的方法
Nov 21 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
Aug 12 Javascript
微信小程序转化为uni-app项目的方法示例
May 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采用XML-RPC构造Web Service实例教程
2014/07/16 PHP
php常用的url处理函数总结
2014/11/19 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
vue组件学习教程
2017/09/09 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
jQuery实现放大镜案例
2020/10/19 jQuery
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
python中函数默认值使用注意点详解
2016/06/01 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
利用Python2下载单张图片与爬取网页图片实例代码
2017/12/25 Python
Python命令行解析模块详解
2018/02/01 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
python实现全排列代码(回溯、深度优先搜索)
2020/02/26 Python
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
台湾生鲜宅配:大口市集
2017/10/14 全球购物
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
工商治理实习生的自我评价分享
2014/02/20 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
党支部活动策划方案
2014/08/18 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
感恩母亲节活动总结
2015/02/10 职场文书
经典人生语录分享:不畏将来,不念过去,笑对当下
2019/12/12 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP
macos系统如何实现微信双开? mac登录两个微信以上微信的技巧
2022/07/23 数码科技