在后面的 5 篇文章打底下,咱们应该接入点接地气的业务了。
本篇开始将接触前端多语言性能。
不晓得小伙伴们有没有接触过,这一次 jsliang 将把实在的我的项目中对于多语言的解决(对,仅是解决而不是解说多语言怎么配置)脱敏后拿进去分享下。
该分享所用的数据仅为参考实在我的项目而虚构,毕竟这只是【工具库】而不是要打造反对多语言的我的项目,然而这套工具批改下还是能用到其余中央的,具备参考价值
本篇文章咱们将解说如何应用 Puppeteer 管制 Chrome/Chromium,从而达到下载文件的目标。
一 前言
Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协定管制 Chromium 或 Chrome。
就跟它在 GitHub 简介中介绍的一样:你在浏览器中手动执行的绝大多数操作都能够应用 Puppeteer 来实现!
- 抓取页面快照
- 生成页面 PDF
- 主动操作页面 DOM
- ……
具体例子小伙伴能够翻看本文下方参考文献的 GitHub 或者中文文档,这里不一一举例(省得被吐槽复制 README.md)
二 Puppeteer
- 装置:
npm i puppeteer
!jsliang 装置的时候报错:
(node:7584) ExperimentalWarning: The fs.promises API is experimental
我的 Node.js 版本是 node@10.16.0
,所以须要降级 Node.js。
查了下材料有 2 种办法降级,一种是下载最新版笼罩装置,另一种是通过 nvm/nvmw
形式去治理。
jsliang 网络还不错,间接下载个最新文档版吧:Node 官网
装置结束后查看下最新版本:
node -v
:v14.17.1
这时候再装置 Puppeteer,显示装置胜利,package.json
显示:"puppeteer": "^10.0.0"
装置 Puppeteer 过程中可能会有各式各样的报错,考验小伙伴们网速的时候到了
装置结束,开始搞事~
2.1 抓取快照
咱们拿抓取页面快照做个简略举例:
src/index.ts
import program from 'commander';
import common from './common';
import './base/console';
import puppeteer from 'puppeteer';
program
.version('0.0.1')
.description('工具库')
program
.command('jsliang')
.description('jsliang 帮忙指令')
.action(() => {common();
});
program
.command('test')
.description('测试频道')
.action(async () => {
// 启动浏览器
const browser = await puppeteer.launch({headless: false, // 关上实体浏览器});
// 创立新标签页并关上
const page = await browser.newPage();
await page.goto('https://www.baidu.com/s?wd=jsliang');
// 获取快照并存储到本地
await page.screenshot({path: './src/baidu.png',});
// 敞开窗口
await browser.close();});
program.parse(process.argv);
执行完 npm run test
之后,src
文件夹外面会呈现图片文件 baidu.png
,关上展现如下:
实测 迷信上网工具 或者 360 安全卫士会对这操作造成影响,为了避免你血压飙升,请确保这些软件的敞开
这样咱们就初步理解 Puppeteer 啦,当然它还能够导出 PDF 等,自行翻下文【参考文献】中的内容对 Puppeteer 进一步理解吧。
2.2 下载文件
既然咱们能够获取到截图,那么咱们能操作 DOM 也就难能可贵,咱们获取下线上的文件吧!
拿金山文档举例,咱们先创立一个 Excel 文件:
创立形式能够本人去玩玩,就不做解说了,金山文档地址:https://www.kdocs.cn/
而后,咱们下个环节就是须要将这个 Excel 下载下来(假如曾经请人做好翻译工作了),就是这样的 Excel:
该图片来源于网络,本次常识分享用以参考,侵权必删
而后咱们搞个简略的吧:
多语言咋样不重要,咱们目标是须要操作 Puppeteer 获取到这个 Excel 文件
OK,文件有了,咱们怎样才能下载下来呢?当初状况是:
- 试想一下如果咱们通过 Puppeteer 关上,那是无头浏览器啊,跟无痕差不多了,如果失常登录的话,须要从新登录、进入链接,而后才是点击按钮,进行下载。
所以,这里用到金山文档的免登录链接:
众所众知免登录就是不必登陆,尽管这个解释很弱智,然而我感觉很有必要……
这里提供下面的 Demo 地址,小伙伴们能够拿来练习,然而不确保这个链接会不会哪天就被我删了,所以依照下面步骤自行设置一个吧!
- 【金山文档 Excel 试用文件.xlsx】:
https://www.kdocs.cn/l/sdwvJUKBzkK2
OK,罗里吧嗦讲了那么多前置条件,上面咱们进入正题 —— 如何获取到线下文件:
- 操作浏览器关上
https://www.kdocs.cn/l/sdwvJUKBzkK2
- 睡眠 6.66s(确保浏览器关上链接并加载页面)
- 而后触发【更多菜单】按钮的点击
- 睡眠 2s(确保更多菜单按钮点击到)
- 设置下载门路(确保下载地位,要不然弹窗就不好解决)
- 最初触发【下载】按钮的点击
- 睡眠 10s(确保资源下载到)
- 敞开窗口
下面惟一要关注的点是第 5 点,因为咱们 Windows 点击下载是会有弹窗的(并不是默认下载),所以须要提前设置好下载门路(代码中会体现)。
那么,上代码!
src/common/index.ts
import {inquirer} from '../base/inquirer';
import {Result} from '../base/interface';
import {sortCatalog} from './sortCatalog';
import {downLoadExcel} from './downLoadExcel';
const common = (): void => {
// 问题路线:看 questionList.ts
const questionList = [
// q0
{
type: 'list',
message: '请问须要什么服务?',
choices: ['公共服务', '文件治理']
},
// q1
{
type: 'list',
message: '以后公共服务有:',
choices: ['文件排序']
},
// q2
{
type: 'input',
message: '须要排序的文件夹为?(绝对路径)',
},
// q3
{
type: 'list',
message: '请问须要什么反对?',
choices: ['多语言', 'Markdown 转 Word'],
},
// q4
{
type: 'list',
message: '请问须要什么反对?',
choices: [
'下载多语言资源',
'导入多语言资源',
'导出多语言资源',
],
},
// q5
{
type: 'input',
message: '资源下载地址(HTTP)?',
default: 'https://www.kdocs.cn/l/sdwvJUKBzkK2',
}
];
const answerList = [
// q0
async (result: Result, questions: any) => {if (result.answer === '公共服务') {questions[1]();} else if (result.answer === '文件治理') {questions[3]();}
},
// q1
async (result: Result, questions: any) => {if (result.answer === '文件排序') {questions[2]();}
},
// q2
async (result: Result, _questions: any, prompts: any) => {const sortResult = await sortCatalog(result.answer);
if (sortResult) {console.log('排序胜利!');
prompts.complete();}
},
// q3
async (result: Result, questions: any) => {if (result.answer === '多语言') {questions[4]();}
},
// q4
async (result: Result, questions: any) => {if (result.answer === '下载多语言资源') {questions[5]();}
},
// q5
async (result: Result, _questions: any, prompts: any) => {if (result.answer) {const downloadResult = await downLoadExcel(result.answer);
if (downloadResult) {console.log('下载胜利!');
prompts.complete();}
}
},
];
inquirer(questionList, answerList);
};
export default common;
看到下面的代码我悔恨了,为啥 Inquirer.ts
被我革新的那么恶心,弄得 jsliang 还须要顺便写个文件来表明问题序列而后才捋顺问题程序:
src/common/questionList.ts
// common 板块的问题征询路线
export const questionList = {
'公共服务': { // q0
'文件排序': { // q1
'须要排序的文件夹': 'Work 工作', // q2
},
},
'文件治理': { // q0
'多语言': { // q3
'下载多语言资源': { // q4
'下载地址': 'Work 工作', // q5
},
'导入多语言资源': { // q4
'导入地址': 'Work 工作',
},
'导出多语言资源': { // q4
'导出全量资源': 'Work 工作',
'导出单门资源': 'Work 工作',
}
},
'Markdown 转 Word': '暂未反对', // q3
},
};
写完后转入写性能上:
src/common/downLoadExcel.ts
import puppeteer from 'puppeteer';
import path from 'path';
import fs from 'fs';
export const downLoadExcel = async (link: string): Promise<boolean> => {
// 启动浏览器
const browser = await puppeteer.launch({
headless: false, // 关上实体浏览器
devtools: true, // 关上开发模式
});
// 1. 创立新标签页并关上
const page = await browser.newPage();
await page.goto(link);
// 2. 睡眠 6.66s - 确保页面失常关上
await page.waitForTimeout(6666);
// 3. 触发【更多菜单】按钮的点击
const moreBtn = await page.$('.header-more-btn');
moreBtn?.click();
// 4. 睡眠 1s - 确保按钮点击到
await page.waitForTimeout(2000);
// 5. 设置下载门路
const dist = path.join(__dirname, './dist');
if (!fs.existsSync(dist)) {fs.mkdirSync(dist);
}
await (page as any)._client?.send('Page.setDownloadBehavior', {
behavior: 'allow',
downloadPath: dist,
});
// 6. 触发【下载】按钮的点击
const elements = await page.$$('.header-menu-item');
let downloadBtn;
if (elements.length) {downloadBtn = elements[8];
}
if (!downloadBtn) {console.error('没找到下载按钮');
await browser.close();}
await downloadBtn?.click();
// 7. 睡眠 10s - 确保资源下载到
await page.waitForTimeout(10000);
// 8. 敞开窗口
await browser.close();
return await true;
};
这样子运行之后,如果控制台不报错,那么 VS Code 展现为:
能够看到 common
目录下确实有 dist/Excel 试用文件.xlsx
了,咱们就能够接入 node-xlsx
这个库来操作 Excel 啦~
下期见!
三 参考文献
- Github: Puppeteer
- Puppeteer
- puppeteer 前端利器
- Puppeteer 之爬虫入门
jsliang 的文档库由 梁峻荣 采纳 常识共享 署名 - 非商业性应用 - 雷同形式共享 4.0 国内 许可协定 进行许可。<br/> 基于 https://github.com/LiangJunrong/document-library 上的作品创作。<br/> 本许可协定受权之外的应用权限能够从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处取得。