{"id":15657492,"url":"https://github.com/justjavac/deno_cheerio","last_synced_at":"2025-08-20T14:12:57.791Z","repository":{"id":37716758,"uuid":"292208481","full_name":"justjavac/deno_cheerio","owner":"justjavac","description":"How to use cheerio in Deno","archived":false,"fork":false,"pushed_at":"2021-04-20T05:18:55.000Z","size":21,"stargazers_count":23,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-07T18:03:49.976Z","etag":null,"topics":["deno","deno-cheerio","deno-modules","nodejs"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/justjavac.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-09-02T07:16:55.000Z","updated_at":"2022-11-24T08:39:48.000Z","dependencies_parsed_at":"2022-09-05T11:10:41.432Z","dependency_job_id":null,"html_url":"https://github.com/justjavac/deno_cheerio","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justjavac%2Fdeno_cheerio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justjavac%2Fdeno_cheerio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justjavac%2Fdeno_cheerio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justjavac%2Fdeno_cheerio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/justjavac","download_url":"https://codeload.github.com/justjavac/deno_cheerio/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252526356,"owners_count":21762482,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["deno","deno-cheerio","deno-modules","nodejs"],"created_at":"2024-10-03T13:07:26.218Z","updated_at":"2025-05-05T15:50:25.502Z","avatar_url":"https://github.com/justjavac.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# deno_cheerio\n\n[![Build Status](https://github.com/justjavac/deno_cheerio/workflows/ci/badge.svg?branch=master)](https://github.com/justjavac/deno_cheerio/actions)\n\n\u003e 记录一次在 Deno 中使用 cheerio 库的过程。\n\n如何在 Deno 中使用 [cheerio](https://github.com/cheeriojs/cheerio)。\n\ncheerio 是一个非常流行的 npm 包，为服务器特别定制的，快速、灵活、实施的 jQuery 核心实现。可以说 cheerio 就是一个 Node.js\n版的 jQuery。\n\n那么我们在 Deno 中如何使用这个库呢？\n\n## 使用\n\n如果直接在 Deno 中使用源码，像这样：\n\n```ts\nimport * as Cheerio from \"https://raw.githubusercontent.com/cheeriojs/cheerio/v1.0.0/lib/cheerio.js\";\n```\n\n会报错：\n\n```plain\nerror: Uncaught ReferenceError: require is not defined\nvar parse = require('./parse'),\n            ^\n    at https://raw.githubusercontent.com/cheeriojs/cheerio/v1.0.0/lib/cheerio.js:6:13\n```\n\n因为 Deno 并不支持 commonjs 规范，只支持 esm。\n\n因此我们必需借助 jspm.io（或其他类似服务）来将 commonjs 转换为兼容的 esm 格式。\n\n我们可以这样：\n\n```ts\nimport cheerio from \"https://dev.jspm.io/npm:cheerio/index.js\";\n\nconst $ = cheerio.load('\u003ch2 class=\"title\"\u003eHello world\u003c/h2\u003e');\n\n$(\"h2.title\").text(\"Hello Deno!\");\n$(\"h2\").addClass(\"deno\");\n\nconsole.log($.html());\n```\n\n我们试着运行一下：\n\n```shell\ndeno run mod.ts\n```\n\n成功输出了 `\u003ch2 class=\"title deno\"\u003eHello Deno!\u003c/h2\u003e`。\n\n## 添加 TypeScript 支持\n\n好在 @types 仓库提供了 cheerio 的类型定义文件，我们在 mod.ts 顶部增加一行：\n\n```diff\n+// @deno-types=\"https://dev.jspm.io/@types/cheerio/index.d.ts\"\n import cheerio from \"https://dev.jspm.io/cheerio/index.js\";\n```\n\n运行一下，又报错了\n\n```plain\nerror: relative import path \"node\" not prefixed with / or ./ or ../ Imported \nfrom \"https://dev.jspm.io/npm:@types/cheerio@0.22.21/index.d.ts\"\n```\n\n看来这个 d.ts 文件和 deno 不兼容，把这个文件下载到本地，新建 cheerio.d.ts 改造一下。\n\n问题出在第 14 行，`/// \u003creference types=\"node\" /\u003e` 与 Deno 不兼容，于是删掉这一行：\n\n```diff\n-/// \u003creference types=\"node\" /\u003e\n-\n```\n\n再次运行，又报错：\n\n```plain\nerror: TS2580 [ERROR]: Cannot find name 'Buffer'. Do you need to install type definitions for node? Try `npm i @types/node`.\n  load(html: string | Buffer, options?: CheerioOptionsInterface): CheerioStatic;\n                      ~~~~~~\n    at https://cdn.jsdelivr.net/gh/justjavac/deno_cheerio/cheerio.d.ts:310:23\n```\n\n`Buffer` 是 nodejs 的类型，所以报错了。\n\n其实 Deno 也有 `Buffer`，我们需要使用 `Deno.Buffer` 来引用，考虑到 Deno 的 `Buffer` 和 Node.js\n的并不兼容，于是直接删掉这个类型。\n\n(补充 2021-04-19，Deno 1.9 已经放弃了 `Deno.Buffer`，在 2.0 会将其移除)\n\n```diff\n-  load(html: string | Buffer, options?: CheerioOptionsInterface): CheerioStatic;\n+  load(html: string, options?: CheerioOptionsInterface): CheerioStatic;\n```\n\n再次运行，终于得到了我们想要的结果：\n\n```plain\n\u003ch2 class=\"title deno\"\u003eHello Deno!\u003c/h2\u003e\n```\n\n## 例子\n\n```bash\ndeno run https://cdn.jsdelivr.net/gh/justjavac/deno_cheerio/mod.ts\n```\n\n## License\n\n[deno_cheerio](https://github.com/justjavac/deno_cheerio) is released under the\nMIT License. See the bundled [LICENSE](./LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjustjavac%2Fdeno_cheerio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjustjavac%2Fdeno_cheerio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjustjavac%2Fdeno_cheerio/lists"}