获取网页中某个class下的链接和其域名
1 |
|
获取网页中某个class下的链接和其域名
1 |
|
node.js实现简单爬虫
工具:cheerio
cheerio 是 nodejs 特别为服务端定制的,能够快速灵活的对 JQuery 核心进行实现。它工作于 DOM 模型上,且解析、操作、呈送都很高效。
更多 API 参看: github.com/cheeriojs/c…
我们以慕课网页面为例,爬取每个视频课程的标题和课程对应 id,期望结构如下:
1 | titles = [{ |
第一步,我们用node写一个请求,获取想要爬虫的网站html,这里以慕课网为例:
1 | var http = require('http') |
第二步,我们根据需求来编写过滤HTML的函数,将过滤后的数据打印在控制台。
1 | function filterChapters(html) { |
爬虫结果:
1 | 【935】Vue+Webpack打造todo应用 |
小结:node.js使得JavaScript代码能够运行在服务端,从而进行一些操作
在项目开发中,成熟的项目往往有国际化的需求,在vue中我们一般使用vue-i18n
来做国际化
但是当我到项目中地址国际化的时候,却犯难了,往常没有碰到过这类需求,正常都是从网上摘抄一份最新的省市区json数据,供我们使用
如果要把地址国际化了,应该怎么办呢?
一个一个翻译肯定时不现实的,去网上搜好像也比较少交这样的资源,要不就是资源地址不全,无法使用,项目中肯定是要准确无误符合我们需求的数据
在网上搜罗了一堆的问题无果后,好像也没有什么实际靠谱的方案
更重要的是对于那种在线api,付费翻译这种方式肯定也不现实,当找到百度翻译开放平台
后,我脑海中突然灵光一现,一开始我的想法就是错误的,为啥要持久的使用别人的服务呢,利用百度翻译
的免费额度
然后把本地省市区数据进行循环、翻译、组合数据,复制,最后保存到本地
说干就干,于是开始了尝试
在百度翻译开放平台
注册后,获得了免费的高级版
随之赶紧去看它的接口文档 api接口文档
查看接口所需传入参数
为了方便数据的处理,新建了一个vue3
项目来进行测试以及生成
贴上代码以及注释
1 | <script setup lang="ts"> |
一般在游览器发起请求到不同的域名是肯定会报跨域的,所以我们需要在脚手架设置一个代理服务器 演示中所使用的为vite,在vite.config.ts中进行配置
1 | import { defineConfig } from 'vite' |
1 | <script setup lang="ts"> |
1 | export default { |
微信官方提供了相关的 API 来预览常见文件,目前支持如下格式的文件
总结一下就是先用 wx.downloadFile
API 把文件下载下来,再用 wx.openDocument
API 把它打开
wx.downloadFile API 单次下载允许的最大文件为 200MB
网络-使用说明(域名只支持 https
(wx.uploadFile、wx.downloadFile) 和 wss
(wx.connectSocket) 协议)
可以结合 DownloadTask 相关 API 实现下载进度展示
需要在小程序后台配置 downloadFile 合法域名才能下载文件
以预览 PDF 文件为例
1 | const util = require('../../utils/util') // 引入封装过的加载提示 |
1 | /* 加载动画相关 */ |
每次点击都要重新下载文件很不友好,可以考虑把文件地址存下来,如果下过了就直接打开
第一次点击调用 wx.downloadFile 将返回的文件本地地址存到 localStorage 缓存里,每次点击前去 localStorage 里看一下有没有这条数据的本地地址,有的话就直接调用 wx.openDocument 打开,打开失败函数里判断下是不是本地文件已经清理掉了,清理掉了就重新下载再打开
Hexo 升级比较简单,老方法 npm-check
、npm-upgrade
、npm-update
一键三连。按以下顺序逐步执行完成后,Hexo 版本及系统插件均会升级到最新。
1 | //以下指令均在Hexo目录下操作,先定位到Hexo目录 |
也可以用可以用 ncu -u
一把梭
1 | $ npm install npm-check-updates -g |
简单如此,就把 package.json
文件给更新了,果然是一把梭啊,爽~~~
对于强迫症的我,习惯性删除重来是必须的
1 | $ rm -fr node_modules/ |
以我多年来瞎折腾的经验看,肯定还有坑。
运行 hexo server
验证一下我的想法,果不其然:
1 | INFO Validating config |
嗯……「deprecated」啊……查一下官方的 Release Note。
果然有个叫「Breaking change」的东东,里面就有说到配置文件的变化。
对比以后,发现主要有如下变化,大家根据自己的需要调整修改就好了:
1 | pretty_urls: |
Swift 有很多其他语言所没有的独特的结构和方法,因此很多刚开始接触 Swift 的开发者并没有发挥它本身的优势。
现在,我们要对view.subviews
中的UIButton
做一些不可描述的事情,用 for 循环怎么来遍历呢?
在下面的写法中,更推荐后面两种写法:
1 | ❌ |
在 Swift 中进行 for 循环,要拿到下标值,一般的写法要么定义局部变量记录下标值
,要么遍历 0..<view.subviews.count
。其实还有个更方便的写法:enumerated()
,可以一次性拿到下标值和遍历的元素。
❌ 第一种肯定是不推荐的,因为还要定义额外的局部变量,容易出错,pass
✅ 第二种在只需要用到下标值的时候,是可以用的,但如果还要用到下标值对应的元素,就还得再取一次,麻烦,pass
✅ 第三种就比较完美,虽然一次性可以拿到下标值和元素,但其中一个用不到就可以用 _
1 | ❌ |
filter
是 Swift 中几个高级函数之一,过滤集合中的元素时非常的好用,不过在某些情况下,比如获取集合中满足条件的第一个元素时,有一个更好的选择first(where: )
1 | let article1 = ArticleModel(title: "11", content: "内容1", articleID: "11111", comments: []) |
这个和上面的first(where: )
几乎一样,比如这里要判断文章列表里是否包含 articleID 为 11111 的文章:
1 | ❌ |
当循环体内的逻辑比较简单时,forEach 往往比 for…in…来的更加简洁:
1 | func removeArticleBy(ID: String) { |
我们知道计算属性本身不存储数据,而是在 get 中返回计算后的值,在 set 中设置其他属性的值,所以和方法很类似,但比方法更简洁。一起来看下面的示例:
1 | ❌ |
尽量使用协议而不是继承。协议可以让代码更加灵活,因为类可同时遵守多个协议。
此外,结构和枚举不能子类化,但是它们可以遵守协议,这就更加放大了协议的好处
尽可能使用 Struct 而不是 Class。Struct 在多线程环境中更安全,更快。
它们最主要的区别, Struct 是值类型,而 Classe 是引用类型,这意味着 Struct 的每个实例都有它自己的唯一副本,而 Class 的每个实例都有对数据的单个副本的引用。
为方便项目中统一调用不同的字号,及字号大小自适应屏幕,对UIFont进行类方法扩展
1 |
|
使用方法
1 | let btn = UIButton(type: .custom) |
- JSAPI Loader(推荐)
- 直接引入JSAPI脚本
<script src = 'https://webapi.amap.com/maps?v=2.0&key=您申请的key值'></script>
1 | <!-- 地图容器 --> |
1 | // 获取位置 |
1 | // 地址搜索 |
1 | // 周边搜索 |
1 | <script> |
1 |
1 | <!--components/container/index.wxml--> |
Componnets数据流向page (通过绑定事件和触发事件传递数据) (当然最简单的一种表现就是直接在组件中塞入数据,这里其实是说的事件触发)
1 | //1.在组件的使用的地方(index.wxml)绑定事件函数 |
1 | //my-behavior.js |
1 | wx.chooseImage({ |
如果不满意官方提供的拍照界面,我们也可以自己手动实现,不过略微麻烦,
上代码
1 | wxml |
1 | data: { |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true