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 相关文章推荐
js几个验证函数代码
Mar 25 Javascript
jquery如何把参数列严格转换成数组实现思路
Apr 01 Javascript
javaScript函数中执行C#代码中的函数方法总结
Aug 07 Javascript
javascript trim函数在IE下不能用的解决方法
Sep 12 Javascript
DeviceOne 让你一见钟情的App快速开发平台
Feb 17 Javascript
原生js实现类似fullpage的单页/全屏滚动
Jan 22 Javascript
js登录滑动验证的实现(不滑动无法登陆)
Jan 03 Javascript
详解vue-cli中模拟数据的两种方法
Jul 03 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
Sep 20 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
Aug 09 Javascript
一个手写的vue放大镜效果
Aug 09 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
Feb 24 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 get_meta_tags()函数
2014/05/12 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
用js遍历 table的脚本
2008/07/23 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
js原生之焦点图转换加定时器实例
2016/12/12 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
Python3基础之输入和输出实例分析
2014/08/18 Python
初步探究Python程序的执行原理
2015/04/11 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
求职者怎样写自荐信
2014/04/13 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
转学证明范本
2015/06/19 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android
Java设计模式之享元模式示例详解
2022/03/03 Java/Android
mysql查找连续出现n次以上的数字
2022/05/11 MySQL