前端开发工程师
2022-08-09 08:58:20 1 举报
AI智能生成
初级到中级前端工程师学习路径
作者其他创作
大纲/内容
Typescript
开发环境
Node.js
https://nodejs.org/en/
typescript
https://www.typescriptlang.org/download
npm install typescript --save-dev
tsc
cmd => 输入tsc验证是否安装成功
tsc helloworld.ts
类型
基础类型
Number
数字
let decLiteral: number = 6;
String
字符串
let name: string = "bob";
Boolean
布尔值
let isDone: boolean = false;
Array
数组
let list: number[] = [1, 2, 3];
let list: Array<number> = [1, 2, 3];
Tuple
元组
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同
let x: [string, number] = ['111', 12];
Enum
枚举
enum类型是对JavaScript标准数据类型的一个补充。 像C#等其它语言一样,使用枚举类型可以为一组数值赋予友好的名字。
enum sex {man = 1, woman = 2, unknow = 3}
let ii: {name: string, gender: sex}
ii = {
name: '123',
gender: sex.man
}
let ii: {name: string, gender: sex}
ii = {
name: '123',
gender: sex.man
}
Any
*
任意类型,值可能来自于动态的内容,可以赋值给任意变量
let notSure: any = 4;
let d; // 隐式的any
Unkown
未知类型
类型安全的any,不能直接赋值给其他变量
let e:unkown = '1'
Void
null/undefined
void类型像是与any类型相反,它表示没有任何类型,只能为它赋予undefined和null
let unusable: void = undefined;
Null/Undefined
null/undefined
默认情况下null和undefined是所有类型的子类型
指定了--strictNullChecks标记,null和undefined只能赋值给void和它们各自
let n: null = null;
let u: undefined = undefined;
Never
never
never类型表示的是那些永不存在的值的类型
never类型是任何类型的子类型,也可以赋值给任何类型
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
throw new Error(message);
}
function error(message: string): never {
throw new Error(message);
}
Object
对象
object表示非原始类型,也就是除number,string,boolean,symbol,null或undefined之外的类型。
declare function create(o: object | null): void;
// 指定对象包含那些属性
let m1: {name: string, age: number}
let m1: {name: string, age: number}
// ? 表示可选属性
let m2: {name: string, age?: number}
let m2: {name: string, age?: number}
// [propName: string]: any 不限制数量,表示任意类型的属性
let m3: {name: string, [propName: string]: any}
let m3: {name: string, [propName: string]: any}
类型断言
类型断言好比其它语言里的类型转换,但是不进行特殊的数据检查和解构。 它没有运行时的影响,只是在编译阶段起作用。
通常这会发生在你清楚地知道一个实体具有比它现有类型更确切的类型。
当你在TypeScript里使用JSX时,只有 as语法断言是被允许的。
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
let strLength: number = (<string>someValue).length;
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
let strLength: number = (someValue as string).length;
高级类型
联合类型
联合类型表示一个值可以是几种类型之一
通过 | 进行分割
let a: string | number
交叉类型
交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性
通过&进行交集
interface Colorful {
color: string;
}
interface Circle {
radius: number;
}
type ColorfulCircle = Colorful & Circle;
color: string;
}
interface Circle {
radius: number;
}
type ColorfulCircle = Colorful & Circle;
类型保护与区分类型
用户自定义的类型保护
parameterName is Type
function isFish(pet: Fish | Bird): pet is Fish {
return (<Fish>pet).swim !== undefined;
}
return (<Fish>pet).swim !== undefined;
}
typeof类型保护
typeof类型保护只有两种形式能被识别:
typeof v === "typename"和 typeof v !== "typename",
"typename"必须是 "number", "string", "boolean"或 "symbol"。
typeof v === "typename"和 typeof v !== "typename",
"typename"必须是 "number", "string", "boolean"或 "symbol"。
instanceof类型保护
instanceof类型保护是通过构造函数来细化类型的一种方式
instanceof的右侧要求是一个构造函数
1. 此构造函数的 prototype属性的类型,如果它的类型不为 any的话
2. 构造签名所返回的类型的联合
1. 此构造函数的 prototype属性的类型,如果它的类型不为 any的话
2. 构造签名所返回的类型的联合
interface Padder {
getPaddingString(): string
}
class SpaceRepeatingPadder implements Padder {
constructor(private numSpaces: number) { }
getPaddingString() {
return Array(this.numSpaces + 1).join(" ");
}
}
class StringPadder implements Padder {
constructor(private value: string) { }
getPaddingString() {
return this.value;
}
}
function getRandomPadder() {
return Math.random() < 0.5 ?
new SpaceRepeatingPadder(4) :
new StringPadder(" ");
}
// 类型为SpaceRepeatingPadder | StringPadder
let padder: Padder = getRandomPadder();
if (padder instanceof SpaceRepeatingPadder) {
padder; // 类型细化为'SpaceRepeatingPadder'
}
if (padder instanceof StringPadder) {
padder; // 类型细化为'StringPadder'
}
getPaddingString(): string
}
class SpaceRepeatingPadder implements Padder {
constructor(private numSpaces: number) { }
getPaddingString() {
return Array(this.numSpaces + 1).join(" ");
}
}
class StringPadder implements Padder {
constructor(private value: string) { }
getPaddingString() {
return this.value;
}
}
function getRandomPadder() {
return Math.random() < 0.5 ?
new SpaceRepeatingPadder(4) :
new StringPadder(" ");
}
// 类型为SpaceRepeatingPadder | StringPadder
let padder: Padder = getRandomPadder();
if (padder instanceof SpaceRepeatingPadder) {
padder; // 类型细化为'SpaceRepeatingPadder'
}
if (padder instanceof StringPadder) {
padder; // 类型细化为'StringPadder'
}
可以为null的类型
可选参数和可选属性
--strictNullChecks,可选参数会被自动地加上 | undefined
function f(x: number, y?: number) {
return x + (y || 0);
}
return x + (y || 0);
}
class C {
a: number;
b?: number;
}
a: number;
b?: number;
}
类型保护和类型断言
类型断言 !
identifier!从 identifier的类型里去除了 null和 undefined
类型保护
function f(sn: string | null): string {
return sn || "default";
}
return sn || "default";
}
类型别名
类型别名会给一个类型起个新名字
字符串字面量类型
数字字面量类型
枚举成员类型
可辨识联合
多态的 this类型
索引类型
映射类型
编译选项
tsconfig.json
https://www.typescriptlang.org/tsconfig
include
指定需要编译的TS文件 | * 任意文件 ** 任意目录
"include": [
"./src/**/*"
],
"./src/**/*"
],
exclude
定义需要排除在外的目录
默认值: ["node_modules","brower_components","jspm_packages"]
"exclude": [
"./src/hello/**/*"
]
"./src/hello/**/*"
]
extends
定义继承配置文件
"extends": "./config/base"
files
指定被编译文件的列表,只有编译文件少时才会被用到
"files": [
"hello.ts"
]
"hello.ts"
]
compilerOptions
编译器的选项
https://www.typescriptlang.org/docs/handbook/compiler-options.html
allowJs
Boolean
false
允许编译javascript文件
allowSyntheticDefaultImports
Boolean
module === "system" 或设置了 --esModuleInterop 且 module 不为 es2015 / esnext
允许从没有设置默认导出的模块中默认导入。这并不影响代码的输出,仅为了类型检查
allowUnreachableCode
Boolean
false
不报告执行不到的代码错误
allowUnusedLabels
Boolean
false
不报告未使用的标签错误
alwaysStrict
Boolean
false
以严格模式解析并为每个源文件生成 "use strict"语句
baseUrl
String
无
解析非相对模块名的基准目录
https://www.tslang.cn/docs/handbook/module-resolution.html#base-url
charset
String
utf8
输入文件的字符集
checkJs
Boolean
false
在 .js文件中报告错误。与 --allowJs配合使用
composite
Boolean
false
启用允许将 TypeScript 项目与项目引用一起使用的约束。
declaration
Boolean
false
生成对应的.d.ts文件
declarationDir
String
无
指定生成的声明文件的输出目录
declarationMap
Boolean
false
为d.ts文件创建源映射
diagnostics
Boolean
false
构建后输出编译诊断信息
disableReferencedProjectLoad
Boolean
无
禁止引用项目加载,减少ts项目自动加载数量
disableSizeLimit
Boolean
false
禁用JavaScript工程体积大小的显示,删除 TypeScript 语言服务器中 JavaScript 文件总源代码大小的 20mb 上限。
disableSolutionSearching
Boolean
无
禁用解决方案搜索,编辑时从多项目参考检查中选择一个项目
disableSourceOfProjectReferenceRedirect
Boolean
无
在引用复合项目时禁用首选源文件而不是声明文件。
downlevelIteration
Boolean
false
下层迭代
emitBOM
Boolean
无
在输出文件的开头发出UTF-8字节顺序标记(BOM)
emitDeclarationOnly
Boolean
无
仅输出 d.ts 文件,而不输出 JavaScript 文件
emitDecoratorMetadata
Boolean
无
为源文件中的修饰声明发出设计类型元数据
esModuleInterop
Boolean
false
发出额外的 JavaScript 以简化对导入 CommonJS 模块的支持
exactOptionalPropertyTypes
boolean
无
在类型检查时区分未定义和不存在
experimentalDecorators
Boolean
无
启用对 TC39 第 2 阶段草稿装饰器的实验性支持。
explainFiles
Boolean
无
打印编译期间读取的文件,包括包含该文件的原因
extendedDiagnostics
Boolean
false
生成后输出更详细的编译器性能信息。
forceConsistentCasingInFileNames
Boolean
false
确保进口时大小写正确
generateCpuProfile
String
profile.cpuprof
发出编译器运行以进行调试的 v8 CPU 配置文件
importHelpers
Boolean
false
允许每个项目从 tslib 导入一次帮助程序函数,而不是在每个文件中包含它们
importsNotUsedAsValues
remove或preserve或error
无
为仅用于类型的导入指定发出/检查行为
incremental
Boolean
无
保存 .tsbuildinfo 文件以允许对项目进行增量编译。
inlineSourceMap
Boolean
false
在发出的 JavaScript 中包含源映射文件。
inlineSources
Boolean
false
在发出的 JavaScript 内的源映射中包含源代码
isolatedModules
Boolean
false
确保每个文件都可以安全地转译,而无需依赖其他导入
jsx
preserve, react, react-native, react-jsx, react-jsxdev
无
指定生成的JSX代码
jsxFactory
String
React.createElement
指定面向 React JSX 发出时使用的 JSX 工厂函数,例如 'React.createElement' 或 'h'
jsxFragmentFactory
String
无
指定用于面向 React JSX 发出的片段的 JSX 片段引用,例如 'React.Fragment' 或 'Fragment'
jsxImportSource
String
react
指定在使用 时用于导入 JSX 工厂函数的模块说明符。jsx: react-jsx*
keyofStringsOnly
Boolean
false
使 keyof 仅返回字符串,而不是字符串、数字或符号。旧版选项
lib
list
无
指定一组描述目标运行时环境的捆绑库声明文件
listEmittedFiles
Boolean
false
编译后打印发出的文件的名称
listFiles
Boolean
false
打印编译期间读取的所有文件
mapRoot
String
无
指定调试器应将地图文件而不是生成的位置放在该位置的位置
maxNodeModuleJsDepth
number
0
指定用于检查来自node_modules,仅适用于allowJs
module
none, commonjs, amd,
umd, system, es6/es2015,
es2020, es2022, esnext,
node12, or nodenext
umd, system, es6/es2015,
es2020, es2022, esnext,
node12, or nodenext
CommonJS if target is ES3 or ES5,
ES6/ES2015 otherwise.
ES6/ES2015 otherwise.
指定生成的模块代码
moduleResolution
classic or node
Classic if module is AMD, UMD, System or ES6/ES2015,
Matches if module is node12 or nodenext,
Node otherwise.
Matches if module is node12 or nodenext,
Node otherwise.
指定 TypeScript 如何从给定模块说明符查找文件
newLine
crlf or lf
系统默认值
设置用于发出文件的换行符
noEmit
Boolean
false
不生成编译文件
noEmitHelpers
Boolean
false
禁用生成自定义帮助程序函数,如在编译的输出中。__extends
noEmitOnError
Boolean
false
如果报告了任何类型检查错误,则不编译文件
noErrorTruncation
Boolean
false
禁用错误消息中的截断类型
noFallthroughCasesInSwitch
Boolean
为 switch 语句中的故障切换案例启用错误报告
noImplicitAny
Boolean
true if strict,false otherwise
为具有隐含类型的表达式和声明启用错误报告
noImplicitOverride
Boolean
无
确保使用重写修饰符标记派生类中的重写成员
noImplicitReturns
Boolean
false
为未在函数中显式返回的代码路径启用错误报告
noImplicitThis
Boolean
true if strict,false otherwise
不允许不明确类型的this
noImplicitUseStrict
Boolean
false
禁止在发出的 JavaScript 文件中添加"使用严格"指令
noLib
Boolean
false
禁用包含任何库文件,包括默认的 lib.d.ts
noPropertyAccessFromIndexSignature
Boolean
false
对使用索引类型声明的键强制使用索引访问器
noResolve
Boolean
false
禁用 imports, requires or <reference>s 从扩展TypeScript应添加到项目中的文件大小
noStrictGenericChecks
Boolean
false
禁用对函数类型中的泛型签名的严格检查
noUncheckedIndexedAccess
Boolean
无
使用索引访问时添加undefined到一个类型
noUnusedLocals
Boolean
false
在未读取局部变量时启用错误报告
noUnusedParameters
Boolean
false
noUnusedParameters
out
String
n/a
已弃用的设置,请改用 outFile
outDir
String
n/a
为所有发出的文件指定输出文件夹
outFile
String
n/a
指定一个将所有输出捆绑到一个 JavaScript 文件中的文件。如果declaration为 true,则还指定捆绑所有 .d.ts 输出的文件
paths
Object
无
指定一组将导入重新映射到其他查找位置的条目
plugins
list
无
指定要包含的语言服务插件的列表
preserveConstEnums
Boolean
true if isolatedModules,false otherwise.
禁用擦除 const enum 生成的代码中的声明
preserveSymlinks
Boolean
n/a
禁用解析指向其真实路径的符号链接。这与节点中的相同标志相关
preserveValueImports
Boolean
无
在 JavaScript 输出中保留未使用的导入值,否则这些值将被删除
preserveWatchOutput
Boolean
n/a
禁止在监视模式下擦除主机
pretty
Boolean
true
在 TypeScript 的输出中启用颜色和格式,使编译器错误更易于阅读
reactNamespace
String
React
指定createElementreact为调用的对象。这仅适用于面向 JSX 发出的情况
removeComments
Boolean
false
移除注释
resolveJsonModule
Boolean
false
启用导入 .json 文件
rootDir
String
根据输入文件列表计算
指定源文件中的根文件夹
rootDirs
list
根据输入文件列表计算
在解析模块时,允许将多个文件夹视为一个文件夹
skipDefaultLibCheck
Boolean
false
跳过类型检查 TypeScript 附带的 .d.ts 文件
skipLibCheck
Boolean
false
跳过类型检查所有 .d.ts 文件
sourceMap
Boolean
false
为发出的 JavaScript 文件创建源映射文件
sourceRoot
String
无
指定调试器的根路径以查找引用源代码
strict
Boolean
false
启用所有严格的类型检查选项
strictBindCallApply
Boolean
true if strict,false otherwise.
检查bind,call,apply方法的参数是否和原函数匹配
strictFunctionTypes
Boolean
true if strict,false otherwise.
分配函数时,请检查以确保参数和返回值与子类型兼容
strictNullChecks
Boolean
true if strict,false otherwise.
进行类型检查的时候考虑null和undefined,严格检查空值
strictPropertyInitialization
Boolean
true if strict,false otherwise.
检查已声明但未在构造函数中设置的类属性
stripInternal
Boolean
无
在JSDoc注释中禁用具有@internal的声明
suppressExcessPropertyErrors
Boolean
false
suppressImplicitAnyIndexErrors
Boolean
false
禁止显示noImplicit在为缺少索引签名的对象编制索引时出现任何错误
target
es3, es5, es6/es2015, es2016, es2017, es2018, es2019, es2020, es2021, or esnex
ES3
为发出的 JavaScript 设置 JavaScript 语言版本,并包含兼容的库声明
traceResolution
Boolean
false
记录期间使用的路径 moduleResolution 过程.
tsBuildInfoFile
String
.tsbuildinfo
指定 .tsbuildinfo 增量编译文件的文件夹
typeRoots
list
无
指定多个文件夹,其作用类似于 ./node_modules/@types
types
list
无
指定要包含的类型包名称,而不在源文件中引用
useDefineForClassFields
Boolean
true if target is ES2022 or higher, including ESNext,false otherwise.
发出符合 ECMAScript 标准的类字段
useUnknownInCatchVariables
Boolean
true if strict,false otherwise.
默认缺省值是unknow而不是any
接口(interface)
接口用来定义一个类结构,用来定义一个类中应包含那些属性和方法
接口也可以当成类型声明去使用,且可重复命名
接口只定义对象的结构,不考虑实际值
接口中所属有的方法都是抽象方法
/**
* 对象类型声明
*/
type myType = {
name: string,
age: number
}
const obj: myType = {
name: '111',
age: 123
}
/**
* 对象类型声明
*/
interface myInterface {
// 接口只定义对象的结构,不考虑实际值
name: string
age: number
}
// 接口也可以当成类型声明去使用,且可重复命名
interface myInterface {
gender: string
}
const obj1: myInterface = {
name: '444',
age: 123,
gender: '12'
}
interface helloInterface {
name: string
//接口中所属有的方法都是抽象方法
say(): void
}
/**
* 定义类时,可以使类去实现一个接口
* 实现接口就是使类满足接口的要求
*/
class MyClass implements helloInterface {
name: string
constructor(name: string) {
this.name = name
}
say(): void {
throw new Error("Method not implemented.")
}
* 对象类型声明
*/
type myType = {
name: string,
age: number
}
const obj: myType = {
name: '111',
age: 123
}
/**
* 对象类型声明
*/
interface myInterface {
// 接口只定义对象的结构,不考虑实际值
name: string
age: number
}
// 接口也可以当成类型声明去使用,且可重复命名
interface myInterface {
gender: string
}
const obj1: myInterface = {
name: '444',
age: 123,
gender: '12'
}
interface helloInterface {
name: string
//接口中所属有的方法都是抽象方法
say(): void
}
/**
* 定义类时,可以使类去实现一个接口
* 实现接口就是使类满足接口的要求
*/
class MyClass implements helloInterface {
name: string
constructor(name: string) {
this.name = name
}
say(): void {
throw new Error("Method not implemented.")
}
泛型
在定义函数或类时遇到不明确的类型可以使用泛型,泛型可以指定多个
组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能
泛型类使用( <>)括起泛型类型,跟在类名后面
/**
* 在定义函数或类时遇到不明确的类型可以使用泛型
*/
function fn<T>(a: T): T {
return a
}
// 直接调用具有泛型的函数
let res = fn(10) // 不指定泛型,TS自动对类型进行推断
let res2 = fn<string>('123') // 指定泛型
// 泛型可以指定多个
function fn2<T, K>(a: T, b: K):T {
console.log(b);
return a
}
fn2<number, string>(123, '456')
interface Inter{
length: number
}
// 泛型T必须是Inter实现类(子类)
function fn3<T extends Inter>(a: T): number {
return a.length
}
fn3('123')
class myFuc<T> {
name: T
constructor(name: T) {
this.name = name
}
}
const mc = new myFuc<string>('abc')
* 在定义函数或类时遇到不明确的类型可以使用泛型
*/
function fn<T>(a: T): T {
return a
}
// 直接调用具有泛型的函数
let res = fn(10) // 不指定泛型,TS自动对类型进行推断
let res2 = fn<string>('123') // 指定泛型
// 泛型可以指定多个
function fn2<T, K>(a: T, b: K):T {
console.log(b);
return a
}
fn2<number, string>(123, '456')
interface Inter{
length: number
}
// 泛型T必须是Inter实现类(子类)
function fn3<T extends Inter>(a: T): number {
return a.length
}
fn3('123')
class myFuc<T> {
name: T
constructor(name: T) {
this.name = name
}
}
const mc = new myFuc<string>('abc')
高级框架
Vue2/vue3
vuex
vue-router
vue-cli
vite
Vue组件
Vue-SSR
react
react-redux
react-router
mobx
umi
hooks
跨端开发
reactNative
flutter
ElectronJs
小程序
taro
uniapp
PC端UI组件库
Ant Design
Element UI
bootstarp - vue
数据可视化框架
D3
百度echarts
WebGL
three.js
ThingJS
Unity3D
地图服务
百度地图API
天地图
阿里超图
mapbox gl
高德地图
腾讯开发者中心
移动端UI组件库
Uview
vant
TDesign React Mobile
微前端
qiankun
micro-app
前端工程化
工具链
包管理器
npm
yarn
phpm
babel
@babel/core
性能优化
埋点监控SDK
错误监控
持续集成CICD
linux命令
Docker
测试
jest
cypress
代码规范
eslint
prettier
webpack
官网文档
https://webpack.js.org/concepts/
配置过程
创建项目
E:.
└─src
└─index.ts
└─src
└─index.ts
初始化
npm init -y
安装依赖
npm i -D webpack webpack-cli typescript ts-loader
配置webpack.config.js
const path = require('path')
module.exports = {
// 环境
mode: "development",
// 入口文件
entry: "./src/index.ts",
// 指定打包文件所在目录
output: {
// 指定打包文件目录
path: path.resolve(__dirname, 'dist'),
// 指定打包后的文件
filename: "bundle.js",
// 清理输出目录,不需要再安装clean-webpack-plugin
clean: true
},
// 指定webpack打包使用的模块
module: {
// 指定要加载的规则
rules: [
{
// test 指定的是规则生效的文件
test: /\.ts$/,
// 要使用的loader
use: 'ts-loader',
// 要排除的文件
exclude: /node-modules/
}
],
}
}
module.exports = {
// 环境
mode: "development",
// 入口文件
entry: "./src/index.ts",
// 指定打包文件所在目录
output: {
// 指定打包文件目录
path: path.resolve(__dirname, 'dist'),
// 指定打包后的文件
filename: "bundle.js",
// 清理输出目录,不需要再安装clean-webpack-plugin
clean: true
},
// 指定webpack打包使用的模块
module: {
// 指定要加载的规则
rules: [
{
// test 指定的是规则生效的文件
test: /\.ts$/,
// 要使用的loader
use: 'ts-loader',
// 要排除的文件
exclude: /node-modules/
}
],
}
}
配置tsconfig.json
{
"compilerOptions": {
"module": "ES6",
"target": "ES6",
"strict": true
}
}
"compilerOptions": {
"module": "ES6",
"target": "ES6",
"strict": true
}
}
配置package.json
{
"name": "part3",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC"
}
"name": "part3",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC"
}
编译验证
npm run build
新增npm包
npm i -D html-webpack-plugin webpack-dev-server
添加模板文件(src/index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TS learn</title>
</head>
<body>
<div id="box1">
<h1>测试页面</h1>
</div>
</body>
</html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TS learn</title>
</head>
<body>
<div id="box1">
<h1>测试页面</h1>
</div>
</body>
</html>
修改webpack.config.js
const HTMLWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// 配置webpack插件
plugins: [
new HTMLWebpackPlugin({
// 自定义title
// title: "TS学习",
// 模板文件
template: './src/index.html'
})
]
}
module.exports = {
// 配置webpack插件
plugins: [
new HTMLWebpackPlugin({
// 自定义title
// title: "TS学习",
// 模板文件
template: './src/index.html'
})
]
}
修改package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"start": "webpack server --open"
},
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"start": "webpack server --open"
},
运行验证
npm run start
配置webpack.config.js
module.exports = {
// 设置引用模块
resolve: {
extensions: ['.ts', '.js']
}
}
// 设置引用模块
resolve: {
extensions: ['.ts', '.js']
}
}
运行验证
npm run build
兼容性插件
npm i -D @babel/core @babel/preset-env babel-loader core-js
配置webpack.config.js
module.exports = {
// 指定打包文件所在目录
output: {
// 告诉webpack不使用箭头函数
environment: {
arrowFunction: false
}
},
// 指定webpack打包使用的模块
module: {
// 指定要加载的规则
rules: [
{
// test 指定的是规则生效的文件
test: /\.ts$/,
// 要使用的loader
use: [
// 配置babel
{
// 指定加载器
loader: "babel-loader",
// 设置babel
options: {
// 设置预定义环境
presets: [
[
// 指定环境的插件
"@babel/preset-env",
// 配置信息
{
// 要兼容的目标浏览器
targets: {
"chrome": "58",
"ie": "11"
},
// 指定corejs版本
"corejs": "3",
// 使用corejs的方式, "usage"表示按需加载
"useBuiltIns": "usage"
}
]
]
}
},
'ts-loader',
],
// 要排除的文件
exclude: /node-modules/
}
],
}
}
// 指定打包文件所在目录
output: {
// 告诉webpack不使用箭头函数
environment: {
arrowFunction: false
}
},
// 指定webpack打包使用的模块
module: {
// 指定要加载的规则
rules: [
{
// test 指定的是规则生效的文件
test: /\.ts$/,
// 要使用的loader
use: [
// 配置babel
{
// 指定加载器
loader: "babel-loader",
// 设置babel
options: {
// 设置预定义环境
presets: [
[
// 指定环境的插件
"@babel/preset-env",
// 配置信息
{
// 要兼容的目标浏览器
targets: {
"chrome": "58",
"ie": "11"
},
// 指定corejs版本
"corejs": "3",
// 使用corejs的方式, "usage"表示按需加载
"useBuiltIns": "usage"
}
]
]
}
},
'ts-loader',
],
// 要排除的文件
exclude: /node-modules/
}
],
}
}
前端安全
前后端通信
webSocket
EventSource
html / css
css预处理
scss
less
stylus
html元素
分组元素
文本元素
form表单
容器元素
css/css3
float
Flex
grid
BFC
盒模型
css变形
css渐变
css过渡
css动画
布局方式
单列布局
自适应布局
圣杯布局
双飞翼布局
等高布局
定位布局
javascript
ES5
浏览器对象(BOM)
文档对象模型(DOM)
Event 事件
API集合
Ajax - XMLHttpRequest
this的指向
语法/词法
ES6/ES7/ES8/ESNext
fetch
promise
箭头函数
proxy
解构
可选链
类(class)
https://www.typescriptlang.org/docs/handbook/2/classes.html
属性
demo
class Person {
// 定义属性
name: string = '孙悟空'
static age: number = 18
static readonly sex: number = 1
}
// 定义属性
name: string = '孙悟空'
static age: number = 18
static readonly sex: number = 1
}
实例属性
直接定义的属性是实例属性,需要通过对象的实例去访问
const per = new Person()
per.name
const per = new Person()
per.name
静态属性(类属性)
使用static开头的属性是静态属性(类属性),可以直接通过类去访问
Person.age
Person.age
只读属性
readonly开头的属性表示一个只读的属性无法修改
方法
实例方法
直接定义的方法是实例方法,需要通过对象的实例去访问
const per = new Person()
per.sayHello()
const per = new Person()
per.sayHello()
静态方法(类方法)
使用static开头的方法是静态方法(类方法),可以直接通过类去访问
Person.sayHH()
Person.sayHH()
class Person {
// 定义方法
sayHello() {
console.log('hello world');
}
static sayHH() {
console.log('hello static');
}
}
// 定义方法
sayHello() {
console.log('hello world');
}
static sayHH() {
console.log('hello static');
}
}
构造函数(constructor)
构造函数会在我们使用 new创建类实例的时候被调用
构造函数中的this表示的是当前对象
class Dog {
name: string
age: number
constructor (name: string, age: number) {
this.name = name
this.age = age
}
bark() {
console.log('wwwww');
}
}
const dog = new Dog('hh', 18)
const dog1 = new Dog('kk', 18)
console.log(dog);
console.log(dog1);
name: string
age: number
constructor (name: string, age: number) {
this.name = name
this.age = age
}
bark() {
console.log('wwwww');
}
}
const dog = new Dog('hh', 18)
const dog1 = new Dog('kk', 18)
console.log(dog);
console.log(dog1);
继承(extends)
子类从基类(父类)中继承了属性和方法
代码抽象简化
子类可重写父类的方法和属性
super
通过super可以直接调用父类的方法和属性
如果在子类中写构造函数,在子类的构造函数中必须调用父类的构造函数
// 基类(父类)
class Animal {
name: string
age: number
constructor(name:string , age: number) {
this.name = name
this.age = age
}
say() {
console.log('叫叫');
}
}
// 继承基类(父类)的属性和方法
class Dog extends Animal{
name: string = '233'
run() {
console.log(`${this.name}在跑~~~`);
}
sayHello() {
// super 表示当前类的父类
super.say()
}
}
// 继承基类(父类)的属性和方法
class Cat extends Animal{
constructor (name: string, age: number) {
super(name, age)
this.age = age
}
}
const dog = new Dog('123', 1)
const cat = new Cat('456', 2)
console.log(dog);
console.log(cat);
dog.run()
dog.sayHello()
class Animal {
name: string
age: number
constructor(name:string , age: number) {
this.name = name
this.age = age
}
say() {
console.log('叫叫');
}
}
// 继承基类(父类)的属性和方法
class Dog extends Animal{
name: string = '233'
run() {
console.log(`${this.name}在跑~~~`);
}
sayHello() {
// super 表示当前类的父类
super.say()
}
}
// 继承基类(父类)的属性和方法
class Cat extends Animal{
constructor (name: string, age: number) {
super(name, age)
this.age = age
}
}
const dog = new Dog('123', 1)
const cat = new Cat('456', 2)
console.log(dog);
console.log(cat);
dog.run()
dog.sayHello()
抽象类(abstract)
abstract关键字是用于定义抽象类和在抽象类内部定义抽象方法
抽象方法只能定义抽象类中且子类必须对抽象方法进行重写
/**
* 抽象类
*/
abstract class Animal {
name: string
age: number
constructor(name:string , age: number) {
this.name = name
this.age = age
}
/**
* 抽象方法只能定义抽象类中且子类必须对抽象方法进行重写
*
*/
abstract say(): void
}
// 继承基类(父类)的属性和方法
class Dog extends Animal{
name: string = '233'
run() {
console.log(`${this.name}在跑~~~`);
}
say() {
console.log('1111111');
}
}
// 继承基类(父类)的属性和方法
class Cat extends Animal{
constructor (name: string, age: number) {
super(name, age)
this.age = age
}
say() {
console.log('22222');
}
}
const dog = new Dog('123', 1)
const cat = new Cat('456', 2)
console.log(dog);
console.log(cat);
dog.run()
* 抽象类
*/
abstract class Animal {
name: string
age: number
constructor(name:string , age: number) {
this.name = name
this.age = age
}
/**
* 抽象方法只能定义抽象类中且子类必须对抽象方法进行重写
*
*/
abstract say(): void
}
// 继承基类(父类)的属性和方法
class Dog extends Animal{
name: string = '233'
run() {
console.log(`${this.name}在跑~~~`);
}
say() {
console.log('1111111');
}
}
// 继承基类(父类)的属性和方法
class Cat extends Animal{
constructor (name: string, age: number) {
super(name, age)
this.age = age
}
say() {
console.log('22222');
}
}
const dog = new Dog('123', 1)
const cat = new Cat('456', 2)
console.log(dog);
console.log(cat);
dog.run()
修饰符
public
公共修饰符
任意位置访问修改
private
私有修饰符
只有类内可以访问修改 | 通过在类中添加方法是的私有属性(方法)可以被外部访问
protected
受保护的修饰符
只能在当前类和子类中去访问修改
class Person {
/**
* public 公共修饰符 任意位置访问修改
*
* private 私有修饰符 只有类内可以访问修改 | 通过在类中添加方法是的私有属性(方法)可以被外部访问
*
* protected 受保护的修饰符 只能在当前类和子类中去访问修改
*
*/
private _name: string
private _age: number
constructor(name: string, age: number) {
this._name = name
this._age = age
}
// getName() {
// return this._name
// }
// setName(name: string) {
// this._name = name
// }
get name() {
return this._name
}
set name(name: string) {
this._name = name
}
}
const per = new Person('123', 12)
/**
* 现在属性是在对象中设置的,属性可以任意的被修改
*
* 属性可以任意被修改将会导致对象的数据变得非常不安全
*/
// per.name = '789'
// per.age = -10
console.log(per.name);
per.name = '789'
console.log(per.name);
class C {
constructor(public name: string, public age:number ) {
this.name = name
this.age = age
}
}
/**
* public 公共修饰符 任意位置访问修改
*
* private 私有修饰符 只有类内可以访问修改 | 通过在类中添加方法是的私有属性(方法)可以被外部访问
*
* protected 受保护的修饰符 只能在当前类和子类中去访问修改
*
*/
private _name: string
private _age: number
constructor(name: string, age: number) {
this._name = name
this._age = age
}
// getName() {
// return this._name
// }
// setName(name: string) {
// this._name = name
// }
get name() {
return this._name
}
set name(name: string) {
this._name = name
}
}
const per = new Person('123', 12)
/**
* 现在属性是在对象中设置的,属性可以任意的被修改
*
* 属性可以任意被修改将会导致对象的数据变得非常不安全
*/
// per.name = '789'
// per.age = -10
console.log(per.name);
per.name = '789'
console.log(per.name);
class C {
constructor(public name: string, public age:number ) {
this.name = name
this.age = age
}
}
标识符
所谓标识符,就是指给变量、函数、属性或函数的参数起名字。
标识符可以是按照下列格式规则组合起来的一或多个字符
第一个字符必须是一个字母、下划线( _ )或一个美元符号( $ )。
其它字符可以是字母、下划线、美元符号或数字。
按照惯例,ECMAScript 标识符采用驼峰命名法。
标识符不能是关键字和保留字符。
关键字
保留字符
其它不建议使用的标识符
字面量和变量
字面量
字面量都是不可以改变的,由于字面量不是很方便使用,所以在JavaScript中很少直接使用字面量,使用的而是变量。
字面量实际上就是一些固定的值,比如:1、2 、3、true、false、null、NaN、“hello”
变量
变量的作用是给某一个值或对象标注名称
变量的声明: 使用var关键字声明一个变量。var a;
变量的赋值: 使用=为变量赋值。a = 123;
声明和赋值同时进行:var a = 123;
数据类型
类型分类
数据类型决定了一个数据的特征
对于不同的数据类型我们在进行操作时会有很大的不同。
JavaScript( ES5 )中一共有5种基本数据类型:
字符串型(String)
String用于表示一个字符序列,即字符串。
字符串需要使用 单引号 或 双引号 括起来。
字符串需要使用 单引号 或 双引号 括起来。
转义字符
数值型(Number)
Number 类型用来表示整数和浮点数,最常用的功
能就是用来表示10进制的整数和浮点数。
能就是用来表示10进制的整数和浮点数。
Number表示的数字大小是有限的,如果超过了这
个范围,则会返回 ±Infinity。
个范围,则会返回 ±Infinity。
最大值:+1.7976931348623157e+308
最小值:-1.7976931348623157e+308
0以上的最小值:5e-324
特殊的数字
Infinity:正无穷
-Infinity:负无穷
NaN:非法数字(Not A Number)
其它的进制
二进制:0b 开头表示二进制,但是,并不是所有的浏览器都支持
八进制:0 开头表示八进制
十六进制:0x 开头表示十六进制
布尔型(Boolean)
布尔型也被称为逻辑值类型或者真假值类型。
布尔型只能够取真(true)和假(false)两种数值。除此以外, 其它的值都不被支持。
undefined型(Undefined)
Undefined 类型只有一个值,即特殊的 undefined
在使用 var 声明变量但未对其加以初始化时,
这个变量的值就是 undefined。
这个变量的值就是 undefined。
null型(Null)
Null 类型是第二个只有一个值的数据类型,这个特殊的值是 null。
undefined值实际上是由null值衍生出来的,
所以如果比较undefined和null是否相等,
会返回true。
所以如果比较undefined和null是否相等,
会返回true。
typeof运算符
使用typeof操作符可以用来检查一个变量的数据类型。
typeof 数据
强制类型转换
转换为String类型
调用被转换数据类型的toString()方法
调用String()函数,并将被转换的数据作为参数传递给函数
为任意的数据类型 +""
转换为Number类型
方式一:使用Number()函数
字符串 --> 数字
如果是纯数字的字符串,则直接将其转换为数字
如果字符串中有非数字的内容,则转换为NaN
如果字符串是一个空串或者是一个全是空格的字符串,则转换为0
布尔 --> 数字
true 转成 1
false 转成 0
null --> 数字
null 转成 0
undefined --> 数字
undefined 转成 NaN
方式二:这种方式专门用来对付字符串,parseInt() 把一个字符串转换为一个整数
方式三:这种方式专门用来对付字符串,parseFloat() 把一个字符串转换为一个浮点数
转换为Boolean类型
将其它的数据类型转换为Boolean,只能使用Boolean()函数。
数字 —> 布尔
除了0和NaN,其余的都是true
字符串 —> 布尔
除了空串,其余的都是true
null和undefined都会转换为false
子主题
入门框架
jquery
bootstarp
版本控制工具
git
svn
0 条评论
下一页