总结
三套“算法宝典”
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
算法刷题LeetCode中文版(为例)
人与人存在很大的不同,我们都拥有各自的目标,在一线城市漂泊的我偶尔也会羡慕在老家踏踏实实开开心心养老的人,但是我深刻知道自己想要的是一年比一年有进步。
最后,我想说的是,无论你现在什么年龄,位于什么城市,拥有什么背景或学历,跟你比较的人永远都是你自己,所以明年的你看看与今年的你是否有差距,不想做咸鱼的人,只能用尽全力去跳跃。祝愿,明年的你会更好!
由于篇幅有限,下篇的面试技术攻克篇只能够展示出部分的面试题,详细完整版以及答案解析,有需要的可以关注
“webpack”: “^5.33.2”,
“webpack-bundle-analyzer”: “^4.4.1”,
“webpack-cli”: “^4.6.0”,
“webpack-dev-server”: “^3.11.2”,
“webpack-merge”: “^5.7.3”,
webpack5 启动开发服务器命令与之前有所变化,从 webpack-dev-server
转变为 webpack serve
, 因此 package.json 中 script 的 start 修改为: "start": "webpack serve --progress --hot --inline --config build/webpack.dev.js"
- 创建相应文件
与之前没有太大差异。增加变动的有一下几点:
1). 持久化缓存,增加 cache 配置. v5 中缓存默认是 memory,修改设置"filesystem"写入硬盘
// webpack.dev.js
module.exports = merge(common, {
cache: {
type: ‘filesystem’,
}
//…
}
2). 去除插件 clean-webpack-plugin(v5支持),webpack.HashedModuleIdsPlugin(v5更好的 moduleIds & chunkIds),HardSourceWebpackPlugin(v5支持),happypack(v5不兼容)
安装 vue 核心解析插件
解析插件有所不同,从 vue-template-compiler
变成了 @vue/compiler-sfc
, vue-loader
保持不变。 npm i vue-loader @vue/compiler-sfc --save-dev
// 当前我使用版本
“vue-loader”: “^16.2.0”,
“@vue/compiler-sfc”: “^3.0.11”,
安装 vue3 及相关库,添加 vue 类型文件
npm i vue@next vuex@4.0.0-rc.1 vue-router --save
src 文件夹下添加 shims-vue.d.ts 文件,解决 vue 类型报错
// shims-vue.d.ts
declare module ‘*.vue’ {
import type { DefineComponent } from ‘vue’
const component: DefineComponent<{}, {}, any>
export default component
}
安装 html 模板解析插件
npm i html-webpack-plugin --save-dev
安装 typescript 及解析插件
npm i typescript ts-loader --save-dev
配置ts-loader解析:
// webpack.base.js
// rules
{
test: /.(t|j)s$/,
exclude: /node_modules/,
use: [
{
loader: ‘ts-loader’,
options: {
// 指定特定的ts编译配置,为了区分脚本的ts配置
configFile: path.resolve(__dirname, ‘…/tsconfig.loader.json’),
// 对应文件添加个.ts或.tsx后缀
appendTsSuffixTo: [/.vue$/],
},
},
],
}
ts-loader 为单进程执行类型检查和转译,因此效率有些慢,可以用多进程方案:即关闭ts-loader的类型检查,类型检查由 fork-ts-checker-webpack-plugin
插件执行。npm i fork-ts-checker-webpack-plugin --save-dev
// webpack.base.js
// rules
{
test: /.(t|j)s$/,
exclude: /node_modules/,
use: [
{
loader: ‘ts-loader’,
options: {
// 指定特定的ts编译配置,为了区分脚本的ts配置
configFile: path.resolve(__dirname, ‘…/tsconfig.loader.json’),
// 对应文件添加个.ts或.tsx后缀
appendTsSuffixTo: [/.vue$/],
transpileOnly: true, // ? 关闭类型检查,即只进行转译
},
},
],
}
// plugins push
new ForkTsCheckerWebpackPlugin()
至此项目基本可以跑起来了,那么有个问题了:Ts 可以编译为指定版本的 js,那么还需要 babel 么?
tsc 的 target 只转译语法,不集成 polyfill,所以还是得要 babel。
比如把箭头函数转成普通 function、aysnc + await 变成 Promise.then,这是语法转译;
但你运行环境里如果没有 Promise.prototype.finally,那没有就还是没有。
因此我们项目里还是需要 babel.
Webpack 转译 Typescript 现有方案:
综合考虑性能和扩展性,目前比较推荐的是 babel+fork-ts-checker-webpack-plugin
方案。
在 babel7 之前,是需要同时使用 ts-loader 和 babel-loader 的,其编译过程 TS > TS 编译器 > JS > Babel > JS
。可见编译了两次js,效率有些低下。但是 babel7 出来之后有了解析 typescript 的能力,有了这一层面的支持,我们就可以只使用 babel,而不用再加一轮 ts 的编译流程了。
在 babel 7 中,我们使用新的 @babel/preset-typescript
预设,结合一些插件便可以解析大部分的 ts 语法。
那么,Babel 是如何处理 TypeScript 代码的呢?
Babel 删除了所有 TypeScript,将其转换为常规的 JavaScript,并继续以它自己的方式处理。删除了 typescript 则不需要进行类型检查,不会有烦人的类型错误提醒,因此编译速度提升,开开心心编程???
当然,类型安全性检查必不可少,我们可以统一在某个时间集中处理,增加 script:
“check-types”: “tsc --watch”,
添加 babel 解析 typescript
# 安装以下依赖 --save-dev
# webpack loader
babel-loader
# babel 核心
@babel/core
# 智能转换成目标运行环境代码
@babel/preset-env
# 解析 typescript 的 babel 预设
@babel/preset-typescript
# polyfill
@babel/plugin-transform-runtime
# 支持 ts 类的写法
@babel/plugin-proposal-class-properties
# 支持三点展开符
@babel/plugin-proposal-object-rest-spread
# 安装以下依赖 --save
@babel/runtime
@babel/runtime-corejs3
“core-js”: “^3.11.0”,
删除 ts-loader, 添加 babel-loader
{
test: /.(t|j)s$/,
exclude: /node_modules/,
use: [
{
loader: ‘babel-loader’,
},
],
}
项目根目录添加 babel 配置文件 babel.config.js
module.exports = {
presets: [
[
‘@babel/preset-env’,
{
useBuiltIns: ‘usage’, // 按需引入 polyfill
corejs: 3,
},
],
[
‘@babel/preset-typescript’, // 引用Typescript插件
{
allExtensions: true, // 支持所有文件扩展名,否则在vue文件中使用ts会报错
},
],
],
plugins: [
[
‘@babel/plugin-transform-runtime’,
{
corejs: 3,
},
],
‘@babel/proposal-class-properties’,
‘@babel/proposal-object-rest-spread’,
],
}
4. 代码规范
项目中代码规范集成了 EditorConfig, Prettier, ESLint, Husky, Lint-staged,以及如何解决 Prettier 和 ESLint 的冲突的问题,具体实现可以参考 《从 0 开始手把手带你搭建一套规范的 Vue3.x 项目工程环境》这篇文章,讲的很详细这里不再赘述。
5. 提交规范
利用 inquirer 选择配置好的提交类型,以及配合 commitlint 实现 commit 检查
npm i inquirer shelljs @commitlint/{cli,config-conventional} -D
添加 package.json 的 script :
“commitlint”: “commitlint -e”,
“commit”: “node commit/git-commit.js”
创建 commit/git-commit.js 文件
const shell = require(‘shelljs’)
const inquirer = require(‘inquirer’)
const prompsConfig = {
ciType: [
{
type: ‘list’,
name: ‘type’,
message: ‘请选择本次提交的类型:’,
choices: [
{
name: ‘引入新特性’,
value: ‘feat’,
},
{
name: ‘改进代码的结构格式/样式’,
value: ‘style’,
},
{
name: ‘修复 bug’,
value: ‘fix’,
},
{
name: ‘提升性能’,
value: ‘perf’,
},
{
name: ‘删除代码或文件’,
value: ‘delete’,
},
{
name: ‘其他修改, 比如改变构建流程、或者增加依赖库、工具等’,
value: ‘chore’,
},
{
name: ‘重构’,
value: ‘refactor’,
},
{
name: ‘撰写文档’,
value: ‘docs’,
},
{
name: ‘增加测试’,
value: ‘test’,
},
{
name: ‘更新打包文件’,
value: ‘build’,
},
{
name: ‘初次提交’,
value: ‘init’,
},
{
name: ‘发布/版本标签’,
value: ‘release’,
},
{
name: ‘部署功能’,
value: ‘deploy’,
},
{
name: ‘代码回滚’,
value: ‘revert’,
},
{
name: ‘CI持续集成修改’,
value: ‘ci’,
},
],
},
],
ciMsg: {
type: ‘input’,
name: ‘msg’,
总结
三套“算法宝典”
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
算法刷题LeetCode中文版(为例)
人与人存在很大的不同,我们都拥有各自的目标,在一线城市漂泊的我偶尔也会羡慕在老家踏踏实实开开心心养老的人,但是我深刻知道自己想要的是一年比一年有进步。
最后,我想说的是,无论你现在什么年龄,位于什么城市,拥有什么背景或学历,跟你比较的人永远都是你自己,所以明年的你看看与今年的你是否有差距,不想做咸鱼的人,只能用尽全力去跳跃。祝愿,明年的你会更好!