排序
2023年练习前端需要学点什么讲解
预备知识
提问的艺术:
表达问题的能力,解决问题的能力,多想多实践的能力。
善用 GitHub Issue、Google Search、Stack Overflow 检索的能力。
HTML:
了解语义化标签,不过在实际开发中这种东西用的真的多吗,大部分都是 div 一把梭,当然真正做人性化的网站会正确使用语义化标签,不管是后期维护还是对盲人朋友都有很大的帮助。
Meta 标签,常见的有 viewport、keyword 等。
Link、Script 标签的使用,rel、async、defer 等属性的用法。
了解 a11y 是什么。
CSS:
会使用常见属性,如 background、overflow、position 等等。
了解 CSS 盒模型,以及定位。
BFC 是什么,用在什么地方。
CSS3 动画。
各类选择器,伪类(如 :hover, :focus, ::before),以及权重
CSS 变量
个人建议 CSS 不需要刻意去学,CSS 有大部分东西在实际开发中并不会用到,而且 CSS 更新之快,为了保证兼容性和学习成本,大部分新的提案和特征不会立刻被大众接受。而且刻意去记而不去实践很容易忘。
JavaScript
掌握 ES6,如今已没有必要从 ES5 开始。
了解 JS 是一个单线程的语言,动态弱类型语言。
网络请求,了解 XMLHTTPRequest,会使用 Fetch API
DOM、BOM 常用 API,以及会用这种方法来操作 DOM。
事件处理,冒泡、捕获
异步编程,以及如何将回调地域代码转换为 Promise 写法。
以上内容的掌握,并且能借助一些 UI 库实现一个包含网络请求的登陆页面,算是前端入门了。
基础知识
接下来就要打打基础。开始跨进现代前端的第一步。
JavaScript
原型链、继承是怎么一回事。
一些常见的设计模式(工厂模式,观察者模式、订阅发布模式等)。
闭包是什么,使用闭包如何防止内存泄漏。
作用域是什么。
this 的指向、隐式和显式绑定 this。
类型间的隐式转换 (toString(), valueOf, [Symbol.toPrimitive])。
了解 Proxy、Reflect 元编程。
Linux 基础
常用命令(cd, cp, mv, ls, rm, mkdir 等)。
会使用 Git 常用命令。
环境变量
基础工程化
可以先选一个前端框架进行学习。以 React、Vue 2 为例。如果是急着找工作可以学 React,学习曲线上 React 大于 Vue 2,但是 Vue 2 目测会被 Vue 3 慢慢取代,而 Vue 3 的 composition api 在一定程度上与 React Hooks 相似,学习曲线上与 React 几乎一致。学习 React 等于又学习了一个 Vue 3 也是个不错的选择。
React:
了解 JSX 是什么,怎么去使用,JSX 最终编译的产物是什么。
了解 Class Component 的用法,以及生命周期。
了解高阶组件(HOC)。
掌握 React Hooks 使用,函数式组件的开发。
调试的能力,能规避一些不必要的重渲染。
会使用至少一种状态管理库(Redux、Mobx 等)。
至少通读一遍官方文档。
Vue 2:
通读官方文档即可开始。
建议跟着 全栈之巅 学习
Vue 2 在门槛上明显低于其他框架,这也使得 Vue 2 在短时间内吸引了大量学习者,但是在使用过程中,坑明显比 React 要多得多。再加上 Vue 2 不太聪明的报错方式,让调试更加繁琐。这些在实际开发中对比可以深刻体会到。
常用类库:
UI 库:Antd,naive-ui 等
网络请求库:axios,umi-request、ky 等
状态管理库:vuex、pinia、redux、mobx 等
CSS:
了解 CSS 预处理器是什么,解决了什么问题(Less、SCSS、Stylus 等)
CSS Module 是什么,解决了什么问题。
CSS in JS 是什么。
工具链:
会使用 Git 管理代码
npm, yarn, pnpm
了解打包工具,至少知道是干什么的:Webpack、Rollup、Vite、etc.
架构:
项目目录分配
路由处理
数据管理,持久化数据存储的处理
MVVM
NodeJS:
会使用 Express、Koa 或其他服务器框架建立简单的服务器。
数据库的使用: CRUD,借助 ORM、ODM 库(MongoDB: mongoose, typegoose. MySql: typeorm. etc.)
RESTFul 接口标准。
到这里为止,可以去找个厂上班了。刷刷面试题,问题应该不大。当然有几个拿得出手的项目还是不可少的。
再深入工程化
工具链:
会使用至少一种打包工具,配置的能力、发包的能力,package.json 的定义。(main, type, files, module, etc.)
配置 ESLint、Prettier、StyleLint,统一代码风格。
部署 CI/CD,自动化流程。
husky、lint-staged
Babel 是什么、SWC 了解、ESBuild 了解。
React:
理解 React 的 Diff 方式,为什么会重渲染,如何避免或减少重渲染。性能优化。
拆分组件。抽离 Hooks。
Vue 3:
通读 Vue 3 文档。
Composition API、Proxy。
多实践多踩踩坑。
TypeScript:
必学。不要求非常会做体操,简单的类型要会写。然后项目开始用 TypeScript 重构。
架构:
monorepo
微前端
独立组件库
SSR/SPA/CSR/SSG,同构实践
CSS:
会使用一种原子 CSS 框架(TailwindCSS, WindiCSS, etc.)
了解 PostCSS
方向
大前端:
移动端开发:React Native、Ionic 等
小程序开发:微信小程序、uni-app、remax 等
桌面端开发:Electron、NodeGUI 等
H5 开发
游戏开发:Canvas、WebAssembly 等
架构:
AST
设计模式
算法与数据结构
Rust、Go
python文件打包成exe格式的方法
如何将python文件打包成exe格式
1、安装pyinstaller
打开命令行,安装pyinstaller模块
1 pip install pyinstaller
若出现如下图所示的无法连接HTTPS的问题请参考文章:成功解决win10下 Can’t connect to HTTPS URL because the SSL module is not available
查看是否安装成功
1 pip list
2、进入python文件的存储位置
看自己的保存路径
3、生成exe文件
执行命令
1 pyinstaller -F tree.py(要打包的脚本文件)
执行完成之后会新增如下图所示的文件
而我们所需要的exe文件就在dist文件夹下面
点击就可以运行了
4、pyinstaller详解
Pyinstaller -F tree.py 打包exe
Pyinstaller -F -w tree.py 不带控制台的打包
Pyinstaller -F -w -i tree.ico tree.py 打包指定exe图标打包
分享一些常用的的Python代码
我们开始吧
日期生成
很多时候我们需要批量生成日期,方法有很多,这里分享两段代码
获取过去 N 天的日期
importdatetime
defget_nday_list(n):
before_n_days=[]
foriinrange(1,n+1)[::-1]:
before_n_days.append(str(datetime.date.today()-datetime.timedelta(days=i)))
returnbefore_n_days
a=get_nday_list(30)
print(a)
Output:
['2021-12-23', '2021-12-24', '2021-12-25', '2021-12-26', '2021-12-27', '2021-12-28', '2021-12-29', '2021-12-30', '2021-12-31', '2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05', '2022-01-06', '2022-01-07', '2022-01-08', '2022-01-09', '2022-01-10', '2022-01-11', '2022-01-12', '2022-01-13', '2022-01-14', '2022-01-15', '2022-01-16', '2022-01-17', '2022-01-18', '2022-01-19', '2022-01-20', '2022-01-21']
生成一段时间内的日期
importdatetime
defcreate_assist_date(datestart=None,dateend=None):
创建日期辅助表
ifdatestartisNone:
datestart='2016-01-01'
ifdateendisNone:
dateend=datetime.datetime.now().strftime('%Y-%m-%d')
转为日期格式
datestart=datetime.datetime.strptime(datestart,'%Y-%m-%d')
dateend=datetime.datetime.strptime(dateend,'%Y-%m-%d')
date_list=[]
date_list.append(datestart.strftime('%Y-%m-%d'))
whiledatestart
Output:
['2021-12-27', '2021-12-28', '2021-12-29', '2021-12-30']
保存数据到CSV
保存数据到 CSV 是太常见的操作了,分享一段我个人比较喜欢的写法
defsave_data(data,date):
ifnotos.path.exists(r'2021data%s.csv'%date):
withopen("2021data%s.csv"%date,"a+",encoding='utf-8')asf:
f.write("标题,热度,时间,url\n")
foriindata:
title=i["title"]
extra=i["extra"]
time=i['time']
url=i["url"]
row='{},{},{},{}'.format(title,extra,time,url)
f.write(row)
f.write('\n')
else:
withopen("2021data%s.csv"%date,"a+",encoding='utf-8')asf:
foriindata:
title=i["title"]
extra=i["extra"]
time=i['time']
url=i["url"]
row='{},{},{},{}'.format(title,extra,time,url)
f.write(row)
f.write('\n')
带背景颜色的 Pyecharts
Pyecharts 作为 Echarts 的优秀 Python 实现,受到众多开发者的青睐,用 Pyecharts 作图时,使用一个舒服的背景也会给我们的图表增色不少
以饼图为例,通过添加 JavaScript 代码来改变背景颜色
defpie_rosetype(data)->Pie:
background_color_js=(
"newecharts.graphic.LinearGradient(0,0,0,1,"
"[{offset:0,color:'#c86589'},{offset:1,color:'#06a7ff'}],false)"
)
c=(
Pie(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js)))
.add(
"",
data,
radius=["30%","75%"],
center=["45%","50%"],
rosetype="radius",
label_opts=opts.LabelOpts(formatter="{b}:{c}"),
)
.set_global_opts(title_opts=opts.TitleOpts(title=""),
)
)
returnc
requests 库调用
据统计,requests 库是 Python 家族里被引用得最多的第三方库,足见其江湖地位之高大!
发送 GET 请求
importrequests
headers={
'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/96.0.4664.110Safari/537.36',
'cookie':'some_cookie'
}
response=requests.request("GET",url,headers=headers)
发送 POST 请求
importrequests
payload={}
files=[]
headers={
'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/96.0.4664.110Safari/537.36',
'cookie':'some_cookie'
}
response=requests.request("POST",url,headers=headers,data=payload,files=files)
根据某些条件循环请求,比如根据生成的日期
defget_data(mydate):
date_list=create_assist_date(mydate)
url="https://test.test"
files=[]
headers={
'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/96.0.4664.110Safari/537.36',
'cookie':''
}
fordindate_list:
payload={'p':'10',
'day':d,
'nodeid':'1',
't':'itemsbydate',
'c':'node'}
foriinrange(1,100):
payload['p']=str(i)
print("getdataof%sinpage%s"%(d,str(i)))
response=requests.request("POST",url,headers=headers,data=payload,files=files)
items=response.json()['data']['items']
ifitems:
save_data(items,d)
else:
break
Python 操作各种数据库
操作 Redis
连接 Redis
imortredis
defredis_conn_pool():
pool=redis.ConnectionPool(host='localhost',port=6379,decode_responses=True)
rd=redis.Redis(connection_pool=pool)
returnrd
写入 Redis
fromredis_connimportredis_conn_pool
rd=redis_conn_pool()
rd.set('test_data','mytest')
操作 MongoDB
连接 MongoDB
frompymongoimportMongoClient
conn=MongoClient("mongodb://%s:%s@ipaddress:49974/mydb"%('username','password'))
db=conn.mydb
mongo_collection=db.mydata
批量插入数据
res=requests.get(url,params=query).json()
commentList=res['data']['commentList']
mongo_collection.insert_many(commentList)
操作 MySQL
连接 MySQL
importMySQLdb
打开数据库连接
db=MySQLdb.connect("localhost","testuser","test123","TESTDB",charset='utf8')
使用cursor()方法获取操作游标
cursor=db.cursor()
执行 SQL 语句
使用execute方法执行SQL语句
cursor.execute("SELECTVERSION()")
使用fetchone()方法获取一条数据
data=cursor.fetchone()
print"Databaseversion:%s"%data
关闭数据库连接
db.close()
Output:
Database version : 5.0.45
本地文件整理
整理文件涉及需求的比较多,这里分享的是将本地多个 CSV 文件整合成一个文件
importpandasaspd
importos
dflist=[]
foriinos.listdir():
if"csv"ini:
day=i.split('.')[0].split('')[-1]
df=pd.read_csv(i)
df['day']=day
df_list.append(df)
df=pd.concat(df_list,axis=0)
df.to_csv("total.txt",index=0)
多线程代码
多线程也有很多实现方式,我们选择自己最为熟悉顺手的方式即可
importthreading
importtime
exitFlag=0
classmyThread(threading.Thread):
definit(self,threadID,name,delay):
threading.Thread.init(self)
self.threadID=threadID
self.name=name
self.delay=delay
defrun(self):
print("开始线程:"+self.name)
print_time(self.name,self.delay,5)
print("退出线程:"+self.name)
defprint_time(threadName,delay,counter):
whilecounter:
ifexitFlag:
threadName.exit()
time.sleep(delay)
print("%s:%s"%(threadName,time.ctime(time.time())))
counter-=1
创建新线程
thread1=myThread(1,"Thread-1",1)
thread2=myThread(2,"Thread-2",2)
开启新线程
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print("退出主线程")
异步编程代码
异步爬取网站
importasyncio
importaiohttp
importaiofiles
asyncdefget_html(session,url):
try:
asyncwithsession.get(url=url,timeout=8)asresp:
ifnotresp.status//100==2:
print(resp.status)
print("爬取",url,"出现错误")
else:
resp.encoding='utf-8'
text=awaitresp.text()
returntext
exceptExceptionase:
print("出现错误",e)
awaitget_html(session,url)
使用异步请求之后,对应的文件保存也需要使用异步,即是一处异步,处处异步
asyncdefdownload(title_list,content_list):
asyncwithaiofiles.open('{}.txt'.format(title_list[0]),'a',
encoding='utf-8')asf:
awaitf.write('{}'.format(str(content_list)))
区块链中智能合约的编程语言
DAML 智能合约语言是一种专门设计的特定领域语言domain specific language(DSL),用于编码应用的共享业务逻辑。它用于区块链环境中分布式应用的开发和部署。
区块链技术是一种安全机制,以一种使人难以或不可能修改或入侵的方式来跟踪信息。区块链整合了交易的数字账本,它被复制并发送至其网络上的每台计算机。在链的每个区块中,都有一些交易。当区块链上发生新的交易时,该交易的记录就会被添加到属于该链的每个人的账簿中。
区块链使用分布式账本技术distributed ledger technology(DLT),其中数据库并不保存在一个服务器或节点中。在区块链中,交易被记录在一个被称为哈希hash的不可改变的加密符号中。这意味着,如果一个通道或链上的一个区块被改变,黑客将很难改变链上的那个区块,因为他们必须对外面的每一个版本的链都要这样做。区块链,如比特币和以太坊,随着新的区块被添加到链上而不断增长,这使得账本更加安全。
随着区块链中智能合约的实施,在没有任何人工干预的情况下,有了自动执行的场景。智能合约技术使得执行最高级别的安全、隐私和反黑客实施成为可能。
区块链的用例和应用是:
加密货币
智能合约
安全的个人信息
数字健康记录
电子政务
不可伪造的代币(NFT)
游戏
跨境金融交易
数字投票
供应链管理
根据 Statista.com,自过去几年以来,区块链技术市场的规模正在以非常快的速度增长,预计到 2025 年将达到 400 亿美元。
区块链的编程语言和工具箱
有许多编程语言和开发工具包可用于分布式应用和智能合约。区块链的编程和脚本语言包括 Solidity、Java、Vyper、Serpent、Python、JavaScript、GoLang、PHP、C++、Ruby、Rust、Erlang 等,并根据实施场景和用例进行使用。
选择一个合适的平台来开发和部署区块链,取决于一系列因素,包括对安全、隐私、交易速度
开发区块链的主要平台有:
以太坊
XDC Network
Tezos
Stellar
Hyperledger
Ripple
Hedera Hashgraph
Quorum
Corda
NEO
OpenChain
EOS
Dragonchain
Monero
DAML:一种高性能的编程语言
数字资产建模语言Digital Asset Modeling Language,即 DAML(daml.com),是一种高性能的编程语言,用于开发和部署区块链环境中的分布式应用。它是一个轻量级和简洁的平台,用于快速应用开发。
DAML 的主要特点是:
细粒度的权限
基于场景的测试
数据模型
业务逻辑
确定性的执行
存储抽象化
无重复开销
负责任的跟踪
原子的可组合性
授权检查
需要知道的隐私
安装和使用 DAML
DAML SDK 可以安装在 Linux、macOS 或 Windows 上。在多个操作系统上安装 DAML 的详细说明可访问
https://docs.daml.com/getting-started/installation.html。
你必须具备以下条件才能使用 DAML:
Visual Studio Code
Java 开发套件(JDK)
DAML 可以通过下载并运行可执行的安装程序在 Windows 上安装,你可访问
https://github.com/digital-asset/daml/releases/download/v1.18.1/daml-sdk-1.18.1-windows.exe。
在 Linux 或 Mac 上安装 DAML 可以通过在终端执行以下内容来完成:
$ curl -sSL https://get.daml.com/ | sh
安装 DAML 后,可以创建基于区块链的新应用