这是官方文档:https://cli.vuejs.org/zh/css
npm install -g @vue/cli
vue create vue-ts-demo
default 那一项没有包含typescript,咱们选择 Manually select features这一项。html
我这里选择了babel,typescript,router,vuex,CSS Pre-processors,Linter / Formattervue
而后按照提示选择本身须要安装的,这是个人选择。我没有选择默认的histoty mode for router,习惯了使用hash mode,这些都是能够自由选择的node
配置成功以后webpack
把项目跑起来git
$ cd vue-cli3-ts-demo $ npm run serve
项目跑起来是 npm run serve
,并非之前的 npm run dev
,能够看下package.json里面的代码github
"scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint" },
在浏览器打开地址 "http://localhost:8080/",能够看到项目已经跑起来了web
ts的语法及用法,参考官方文档:https://www.tslang.cn/index.htmlvuex
我以前也写过一些笔记:https://github.com/liujianxi/...vue-cli
├── README.md ├── babel.config.js ├── package-lock.json ├── package.json ├── public │ ├── favicon.ico │ └── index.html ├── src │ ├── App.vue │ ├── assets │ │ └── logo.png │ ├── components │ │ └── HelloWorld.vue │ ├── main.ts │ ├── router │ │ └── index.ts │ ├── shims-tsx.d.ts │ ├── shims-vue.d.ts │ ├── store │ │ └── index.ts │ └── views │ ├── About.vue │ └── Home.vue └── tsconfig.json
看一下项目结构,能够看到shims-tsx.d.ts和shims-vue.d.ts这两个文件
用处以下
shims-tsx.d.ts:容许在vue项目中使用.tsx文件,详细可参考此处
shims-vue.d.ts:容许导入和使用.vue单个文件组件,由于typescript默认并不支持导入vue文件
从项目结构中能够看到,以前的webpack相关的配置都不见了。
而后 vue-cli-service
是个什么东西,文档这么描述的
vue-cli-service serve 命令会启动一个开发服务器 (基于 webpack-dev-server) 并附带开箱即用的模块热重载 (Hot-Module-Replacement)
咱们能够看到 vue-cli-service
是封装好的,开箱即用的。
但是有时候须要本身配置webpack,文档中也有给出方法,就是新建一个vue.config.js文件
vue.config.js 是一个可选的配置文件,若是项目的 (和 package.json 同级的) 根目录中存在这个文件,那么它会被 @vue/cli-service 自动加载。
在package.json同级处新建vue.config.js文件,按照文档,配置以下
// vue.config.js module.exports = { publicPath: process.env.NODE_ENV === 'production' ? './' : '/', outputDir: 'dist', assetsDir: 'static', filenameHashing: true, // eslint-loader 是否在保存的时候检查 lintOnSave: true, // 是否使用包含运行时编译器的Vue核心的构建 runtimeCompiler: false, // 默认状况下 babel-loader 忽略其中的全部文件 node_modules transpileDependencies: [], // 生产环境 sourceMap productionSourceMap: false, // cors 相关 https://jakearchibald.com/2017/es-modules-in-browsers/#always-cors // corsUseCredentials: false, // webpack 配置,键值对象时会合并配置,为方法时会改写配置 // https://cli.vuejs.org/guide/webpack.html#simple-configuration configureWebpack: (config) => { }, // webpack 连接 API,用于生成和修改 webapck 配置 // https://github.com/mozilla-neutrino/webpack-chain chainWebpack: (config) => { // 由于是多页面,因此取消 chunks,每一个页面只对应一个单独的 JS / CSS config.optimization .splitChunks({ cacheGroups: {} }); // 'src/lib' 目录下为外部库文件,不参与 eslint 检测 config.module .rule('eslint') .exclude .add('/Users/maybexia/Downloads/FE/community_built-in/src/lib') .end() }, // 配置高于chainWebpack中关于 css loader 的配置 css: { // 是否开启支持 foo.module.css 样式 requireModuleExtension: true, // 是否使用 css 分离插件 ExtractTextPlugin,采用独立样式文件载入,不采用 <style> 方式内联至 html 文件中 extract: true, // 是否构建样式地图,false 将提升构建速度 sourceMap: false, // css预设器配置项 loaderOptions: { // 给 sass-loader 传递选项 sass: { // @/ 是 src/ 的别名 // 因此这里假设你有 `src/variables.sass` 这个文件 // 注意:在 sass-loader v7 中,这个选项名是 "data" prependData: `@import "~@/variables.sass"` }, // 默认状况下 `sass` 选项会同时对 `sass` 和 `scss` 语法同时生效 // 由于 `scss` 语法在内部也是由 sass-loader 处理的 // 可是在配置 `data` 选项的时候 // `scss` 语法会要求语句结尾必须有分号,`sass` 则要求必须没有分号 // 在这种状况下,咱们可使用 `scss` 选项,对 `scss` 语法进行单独配置 scss: { // prependData: `@import "~@/variables.scss";` }, // 给 less-loader 传递 Less.js 相关选项 less:{ // http://lesscss.org/usage/#less-options-strict-units `Global Variables` // `primary` is global variables fields name globalVars: { primary: '#fff' } } } }, // All options for webpack-dev-server are supported // https://webpack.js.org/configuration/dev-server/ devServer: { open: true, host: '127.0.0.1', port: 3001, https: false, hotOnly: false, proxy: null, before: app => { } }, // 构建时开启多进程处理 babel 编译 parallel: require('os').cpus().length > 1, // https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa pwa: {}, // 第三方插件配置 pluginOptions: {} };
值得注意的是 从 Vue CLI 3.3 起已弃用 baseUrl
,推荐使用 publicPath
。
配置好以后运行 npm run serve
能够看到运行成功,刚配置的host、port已经生效,其余的配置能够本身慢慢添加
项目打包运行 npm run build
也是ok的
项目已经搭建完毕,看一下里面的ts用法
<!-- src/components/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> <style scoped> </style>
vue-property-decorator
是什么呢,文档在这,它提供了函数 装饰器修饰符 语法
从官方文档中可看到
import { Vue, Component, Prop } from 'vue-property-decorator' @Component export default class YourComponent extends Vue { @Prop(Number) readonly propA: number | undefined @Prop({ default: 'default value' }) readonly propB!: string @Prop([String, Boolean]) readonly propC: string | boolean | undefined }
至关于
export default { props: { propA: { type: Number }, propB: { default: 'default value' }, propC: { type: [String, Boolean] } } }
那么src/components/HelloWorld.vue
就至关于
<template> <div class="hello"> <h1>{{ msg }}</h1> </div> ... </template> <script lang="ts"> export default { props: { msg: { type: String } } } </script> <style scoped> </style>
以上
github地址:https://github.com/liujianxi/...