Vuecli3.0 + TS采坑笔记

导读

安装完环境后,在编写代码时可能会遇到问题,从路由、配置、代码提示、检测、使用等多方面进行总结。

Cannot find module '@/components/A/A.vue'

image

项目拉下来就给我来个标红,查了半天,最后还是自己闭目养神想到了!

关闭 Vetur的检测就好

image

组件内的路由守卫无效

在main.ts 下加上如下代码

import Component from 'vue-class-component'

Component.registerHooks([
  'beforeRouteEnter',//进入路由之前
  'beforeRouteLeave',//离开路由之前
  'beforeRouteUpdate'
])

vue-property-decorator 是基于 vue-class-component,之前找了半天vue-property-decorator 没找到

使用CSS module 后热更新失效

vue.config.jscss 配置中不能设置 extract: true,其实不用设置就好,脚手架会自动区分开发环境和生产环境。

详情可看:https://cli.vuejs.org/zh/config/#css-requiremoduleextension

使用开发者工具的Sources面板快速定位到源文件

vue.config.js

const production = process.env.NODE_ENV === "production";

module.exports = {

  configureWebpack: config => {
    if (!production) {
      // 开发环境配置
      config.devtool = "source-map";
    }
  }
}

vue-property-decorator 的一些使用

@Component

@Component
export default class DroppableArea extends Vue {}


@Component({
  components: {
    FlexWrapper,
  },
})
export default class Demo extends Vue {}

@Prop

@Prop({
    default: "",
 })
  
@Prop({
    default: () => defaultRel,//引用类型
})

@Ref

@Ref() readonly fileInput!: HTMLInputElement;

计算属性的声明

get generateAccept() {}

使用函数式编程

需要通过 Vue.extend

import Vue from "vue";
export default Vue.extend({
  functional: true,
  props: {
    tag: {
      type: String,
      default: "div",
    },
  },
  //   render(createElement: CreateElement, context: RenderContext): JSX.Element {

  render(createElement, context): JSX.Element {
    return createElement(context.props.tag, context.data, context.children);
  },
});

ts 类型相关

强制转换

let dom = $event.target! as HTMLElement;

可能为null的处理

const dataTransfer: DataTransfer = $event.dataTransfer!;

获取内置对象类型

Object.prototype.toString.call($event);

路由类型

 beforeRouteEnter(to: Route, form: Route, next: Function) {
    next((vm: Demo) => {
      vm.activeName = to.name!;
    });
  }

编辑vue.config.js 可以得到提示

安装 @types/webpack

vue.config.js

/**
 * @type {import('webpack').Configuration}
 */

提示效果

image

开启脚手架的Tree shaking

package.json 加上 "sideEffects": false

https://www.webpackjs.com/guides/tree-shaking/

tsconfig.json 中的一些配置


    "allowSyntheticDefaultImports": true, // 允许从没有设置默认导出的模块中默认导入
    "strictPropertyInitialization": false, // 定义一个变量就必须给它一个初始值
    "allowJs": true, // 允许编译javascript文件
    // 忽略 this 的类型检查, Raise error on this expressions with an implied any type.
    "noImplicitThis": false,
    "pretty": true, // 给错误和消息设置样式,使用颜色和上下文。

自定义eslint 配置 偏向于逻辑检测

module.exports = {
  root: true,
  env: {
    node: true,
  },
  extends: ["plugin:vue/essential", "@vue/typescript"],
  rules: {
    "no-constant-condition": [
      //不允许在条件中使用常量表达式,循环也要检查,容易造成浏览器卡死,可以使用递归代替。
      "error",
    ],
    "no-cond-assign": "error", //禁止条件表达式中出现赋值操作符
    "no-unreachable": "error", //return+console.log的调试方法,陋习
    "for-direction": "error", //强制 “for” 循环中更新子句的计数器朝着正确的方向移动
    "no-dupe-args": "error", //禁止在 function 定义中出现重复的参数
    "no-dupe-keys": "error", // 禁止对象字面量中出现重复的 key
    "no-duplicate-case": "error", //禁止重复 case 标签
    "no-empty-character-class": "error", //禁止在正则表达式中出现空字符集
    "no-ex-assign": "error", //禁止对 catch 子句中的异常重新赋值
    "no-func-assign": "error", //禁止对 function 声明重新赋值
    "no-invalid-regexp": "error", //禁止在 RegExp 构造函数中出现无效的正则表达式 (no-invalid-regexp)
    "no-obj-calls": "error", //禁止将全局对象当作函数进行调用(no- obj - calls)
    "no-regex-spaces": "error", //禁止正则表达式字面量中出现多个空格
    "no-sparse-arrays": "error", //禁用稀疏数组
    "no-template-curly-in-string": "error", //禁止在常规字符串中出现模板字面量占位符语法
    "no-unexpected-multiline": "error", //禁止使用令人困惑的多行表达式
    "no-unsafe-finally": "error", //禁止在 finally 语句块中出现控制流语句
    "valid-typeof": "error", //强制 typeof 表达式与有效的字符串进行比较
    "use-isnan": "error", //要求调用 isNaN()检查 NaN
    "array-callback-return": "error", //强制数组方法的回调函数中有 return 语句
    "block-scoped-var": "error", //把 var 语句看作是在块级作用域范围之内
    "consistent-return": "error", //要求使用一致的 return 语句
    "default-case": "error", //要求 Switch 语句中有 Default 分支
    "no-alert": "error", //当遇到 alert、prompt 和 confirm 时,该规则将发出警告
    "no-case-declarations": "error", //禁止在 case 或 default 子句中出现词法声明(no -case-declarations)
    "no-fallthrough": "error", //禁止 case 语句落空
    "no-new-wrappers": "error", //禁止原始包装实例
    "no-param-reassign": "error", //禁止对函数参数再赋值
    "no-proto": "error", //禁用__proto__
    "no-redeclare": "error", //禁止重新声明变量
    "no-self-assign": "error", //禁止自身赋值
    "no-self-compare": "error", //禁止自身比较
    "no-sequences": "error", //不允许使用逗号操作符
    "no-throw-literal": "error", //限制可以被抛出的异常
    "no-unmodified-loop-condition": "error", //禁用一成不变的循环条件
    "no-undef": "error", //禁用未声明的变量
    "no-use-before-define": "error", //当使用一个还未声明的标示符是会报警告。
    "no-class-assign": "error", //不允许修改类声明的变量
    "no-const-assign": "error", //不允许改变用const声明的变量
    "no-dupe-class-members": "error", //不允许类成员中有重复的名称
    "no-duplicate-imports": "error", //禁止重复导入
    "no-this-before-super": "error", //在构造函数中禁止在调用super()之前使用this或super
    "no-useless-computed-key": "error", //禁止在对象中使用不必要的计算属性
    "no-var": "error", //要求使用 let 或 const 而不是 var
  },
  parserOptions: {
    parser: "@typescript-eslint/parser",
  },
  overrides: [
    {
      files: ["**/__tests__/*.{j,t}s?(x)"],
      env: {
        mocha: true,
      },
    },
  ],
  // globals: {
  //   _: true, //全局使用_ eslint不报错
  // },
};

代码提示效果演示

vue 属性提示

image

路径提示@

image

路径提示 相对路径

image

原生方法提示

image
image

第三方库lodash 提示,记得安装声明文件

image

地址: https://github.com/xiaodun/sf-time-killer

在VueCli3.0 中使用Lodash

我坑我自己-vuecli3.0 + TS中应用HOC

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 全局安装webpack 全局安装webpack会有个问题,就是当你有两个项目依赖于不同版本的webpack,就会有...
    説好的妹紙呢阅读 1,760评论 0 11
  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,119评论 0 1
  • 一、入坑初探 1. 设置项目为私有 我们只需要在package.json文件中配置,因为是私有项目不需要向外部暴露...
    zxhnext阅读 1,982评论 0 15
  • 官网指南地址 管理资源&管理输出 管理资源 webpack 最出色的功能之一就是,除了 JavaScript,还可...
    前端菜篮子阅读 198评论 0 0
  • 生活中有太多简单好吃的东西 这是小时候,冬天才有的味道 打冻了,比鱼肉更好吃 妈妈都会教我们,放在热乎乎的米饭上 ...
    多汁的牛排阅读 265评论 0 5