Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🤔 FAQ #1

Open
xiaoxian521 opened this issue Nov 29, 2023 · 7 comments
Open

🤔 FAQ #1

xiaoxian521 opened this issue Nov 29, 2023 · 7 comments

Comments

@xiaoxian521
Copy link
Member

xiaoxian521 commented Nov 29, 2023

为什么使用rust编写爬虫程序?

其实使用什么语言编写都行,只不过随着前端生态的发展,越来越多前端相关的程序开始使用rust,也算是跟随潮流吧

  1. rust没有垃圾回收器(GC),而是使用一种独特的内存管理机制,称为所有权 ownership 系统,这也意味着一个程序用rust(不使用GC)和go(使用GC)在编码技术对等的情况下,rust的内存释放在资源不使用时是立即发生的,而go由于是垃圾回收器GC在管理内存,对象的内存不会在使用完毕后立即释放。GC进程是周期性运行的,它需要确定哪些对象不再被引用,然后才能释放这些对象所占用的内存。这个过程涉及到运行时的标记和清理,会有一定的延迟。
  2. rust是一种静态强类型语言。这意味着类型在编译时被检查,任何类型不匹配的操作都会导致编译错误,这有助于避免许多运行时错误,而且其所有权借用系统进一步增强了这种安全性,防止了诸如空指针解引用、数据竞争等常见的并发和内存错误
@xiaoxian521 xiaoxian521 pinned this issue Nov 29, 2023
@xiaoxian521
Copy link
Member Author

xiaoxian521 commented Nov 29, 2023

为什么使用esbuild打包而不是rollup

展开查看esbuild和rollup对比(21条)
  1. 速度:

    • esbuild: 使用Go编写,以速度著称。它使用多核处理和最小化的数据转换步骤来加快打包速度,可以在几秒钟内打包大型代码库。
    • rollup: 使用JavaScript编写的,比esbuild慢,特别是在处理大型项目时。不过,rollup在做树摇(tree-shaking)和代码优化方面非常有效,这也是一个时间消耗的过程。
  2. 打包方式:

    • esbuild: 主要关注速度,它的打包输出可能不如Rollup那样精细优化,但对于大部分用例来说已经足够好。
    • rollup: 采用了一种更传统的打包方法,它会进行更彻底的静态分析以及更好的树摇(tree-shaking),这意味着它可以创建更小的捆绑包。
  3. 生态系统和插件:

    • esbuild: 生态系统正在迅速增长,但由于它比Rollup新,所以可用的插件数量较少。
    • rollup: 有一个成熟的生态系统,有大量社区支持的插件可用,这意味着更多的功能和定制选项。
  4. 特性支持:

    • esbuild: 支持最新的JavaScript标准,包括ES6模块,并且可以直接打包TypeScriptJSX
    • rollup: 同样支持最新的JavaScript标准,并且通过插件支持如TypeScriptJSX等其他文件类型的打包
  5. 易用性:

    • esbuild: 设计理念倾向于简单性和速度,因此其配置通常较为直观和简洁。新用户可能会因为其快速上手和高效的性能而偏好esbuild
    • rollup: 配置有时可能更为复杂,因为它提供了更多的定制化选项。但是,这也意味着开发者可以对打包过程有更细粒度的控制。
  6. 适用场景:

    • esbuild: 由于其快速打包的特性,特别适合于开发环境,可以提供快速的热重载(HMR)体验。它也适用于那些对打包输出大小要求不是特别严格的项目。
    • rollup: 经常被用于生产环境中,特别是那些需要高度优化的库和应用程序。它的高效树摇和代码优化能力使得最终捆绑包尺寸通常较小。
  7. 代码分割与动态导入:

    • esbuild: 支持代码分割和动态导入,但其功能可能没有Rollup那么成熟。
    • rollup: 对代码分割和动态导入提供了很好的支持,并且其插件系统可以进一步增强这些功能。
  8. 源码映射(Source Maps):

    • esbuild: 支持生成源码映射,但由于其重点在于速度,生成的源码映射可能不如Rollup那样详细。
    • rollup: 生成详细的源码映射,这对于调试和开发至关重要。
  9. 构建目标:

    • esbuild: 支持多种输出格式,包括ESMCommonJSiife(立即调用函数表达式),这使得它能够适应多种不同的使用场景。
    • rollup: 也支持多种输出格式,包括ESMCommonJSAMDiife等。Rollup在这方面有更长时间的发展和经验积累,因此很多时候它的输出可能会更加精细和兼容。
  10. 代码压缩:

    • esbuild: 内置了代码压缩功能,能够快速地压缩JavaScript代码。
    • rollup: 本身不提供代码压缩功能,通常需要通过插件来实现代码的压缩。
  11. 调试与错误跟踪:

    • esbuild: 提供错误和警告的详细信息,帮助开发者定位问题。但是,由于其编译速度非常快,有时候在错误信息的准确性和详细程度上可能不如Rollup
    • rollup: 提供详细的错误报告,包括堆栈追踪和相关代码片段,这对于调试问题非常有用。
  12. 社区支持与成熟度:

    • esbuild: 是一个相对较新的项目,尽管它的社区正在迅速增长,但仍然没有Rollup那么成熟和广泛。
    • rollup: 有着较长的发展历史和稳定的社区支持,它的工具和插件生态系统非常丰富,很多问题和模式都已经被社区广泛讨论和解决。
  13. 文档和学习资源:

    • esbuild: 作为新兴工具,其文档相对较少,但基础文档是清晰的,并且随着社区的成长,相关资源也在不断增加。
    • rollup: 拥有详尽的文档和大量的教程,这使得新用户更容易上手并深入理解其工作原理和配置方式。
  14. 维护和更新:

    • esbuild: 由于它是较新的项目,它的功能在快速迭代和更新,但这也意味着可能会出现更多的变化和不稳定性。
    • rollup: 它是成熟的项目,更新通常更加稳定和渐进,用户可以期待较为稳定的API和功能。
  15. 多平台支持:

    • esbuild: 它的Go语言基础使得它可以轻松地跨平台工作,包括WindowsmacOSLinux
    • rollup: 作为Node.js的包,同样支持多平台运行。
  16. 模块缓存:

    • esbuild: 它的速度之快部分得益于它不依赖于缓存机制就能快速进行构建。
    • rollup: 支持模块缓存,这可以在多次构建之间显著加快构建速度,尤其是对于大型项目。
  17. 打包策略:

    • esbuild: 通常采用更简单的打包策略,它不会对模块间的关系进行深度解析,这样可以加快打包速度,但可能牺牲一些潜在的优化。
    • rollup: 执行更深入的代码分析,比如它能更好地处理循环依赖和副作用,从而产出更优化的代码。
  18. 类型检查:

    • esbuild: 自身不进行类型检查,即使它能够打包TypeScript代码。如果需要类型检查,你需要在构建过程中另外运行tscTypeScript编译器)。
    • rollup: 同样不提供类型检查,需要依赖外部插件或单独运行tsc来完成。
  19. 适用项目类型:

    • esbuild: 非常适合中到大型的应用程序或者需要快速迭代的项目,它可以显著减少等待构建完成的时间。
    • rollup: 适用于需要高度优化输出的库或应用,尤其是当这些项目被用作其他项目的依赖时,Rollup可以确保最小化的捆绑体积和最优的性能。
  20. 稳定性和兼容性:

    • esbuild: 作为一个相对较新的项目,在稳定性和兼容性方面可能不如Rollup那么成熟,尽管其开发者正在积极改进这些方面。
    • rollup: 已经被证明在多年的使用中相当稳定,它对旧项目和遗留代码的兼容性较好。
  21. 打包非JavaScript资源:

    • esbuild: 原生支持CSSJSON和一些图像资源的打包,但对于其他类型的资源,可能需要额外的插件或配置。
    • rollup: 可以通过丰富的插件生态来打包几乎任何类型的资源,例如CSS、图片、字体等。

总结来说,esbuild以其惊人的速度和简洁性在现代前端工具链中脱颖而出,特别适合于需要快速构建的开发环境和对构建速度有高要求的场景。而Rollup则在生成小型、高效的库方面有着更多的经验,它的插件生态、定制能力和源码映射支持在复杂项目中仍然是非常有价值的,Rollup目前有些核心处理开始采用rust编写,值得期待。如果你的代码库使用语言复杂(vuetstsxscss)等,且又想要兼容性高、生态强(不需要自己手写插件),那可以选择rollup,如果你的代码使用语言简单(只有JSTSTSXJSON)等,且想要快速打包以及稳定运行可以选择esbuild

当然还有一些别的工具,比如 swc ,被称为 Babel 的替代品,使用rust编写,速度比 Babel 快几十倍,以及后面vite即将推出的Rolldown(还真会起名字 updown😹),被称为 Rollup 的替代品,也是用rust编写,都很值得期待和尝试

通过上面的对比,@esmjs/geo 完全使用esm写法,只打包typescriptJSON文件,且JSON文件体积较大,esbuild是首选

@xiaoxian521
Copy link
Member Author

既然是纯esm包,为什么package.json文件还要加mainmoduletypes配置呢?

首选先解释一下这三个配置的作用

  • main:在package.json文件中,main字段用来指定模块的入口文件。当你创建了一个Node.js模块后,其他人可以通过require()函数来加载你的模块。main字段告诉Node.js,当模块被require时,应该加载哪个文件,用于CommonJScjs
  • module:在package.json文件中,module字段是一个非官方的约定,用于指定一个包含ES6模块语法的版本的入口文件。这个字段是为了兼容现代的JavaScript工具链而设计的,比如WebpackRollup,这些工具可以理解ES6模块的importexport语句。当一个构建工具处理一个包含module字段的package.json文件时,它通常会首先查看该字段指定的文件,以获取模块化的代码。这允许开发者提供两个版本的代码:传统的CommonJS版本(通过main字段指定)以及使用ES6模块语法的版本(通过module字段指定)。
  • types:在package.json文件中,types字段用来指定一个包含类型声明的文件,这对于使用TypeScript的项目特别有用。这个字段通常指向一个包含类型定义的.d.ts文件,使得TypeScript编译器和代码编辑器能够找到并使用这些类型声明来提供类型检查和代码补全功能。当你在TypeScript项目中导入一个模块时,TypeScript编译器会查找这个模块的类型声明。如果package.json包含一个typestypings字段,TypeScript就会使用该字段指定的文件作为该模块的类型声明的入口点。
image

仅支持esm模块的npm包无需设置mainmoduletypes字段

  • 仅支持esm模块的npm包可以在package.json中设置"type": "module",这告诉Node.js你的包中的.js文件应该作为esm模块处理。然后,你可以使用exports字段来明确指定哪些文件可以被其他模块导入。但是为了最大的打包器兼容,@esmjs/geo包还是将上面三个字段配置到package.json
image

@xiaoxian521
Copy link
Member Author

xiaoxian521 commented Nov 29, 2023

如何运行rust爬虫程序?

  1. 安装 Rust 和 Cargo
  2. 安装完成后,使用下面命令运行程序(会根据Cargo.toml文件下载安装依赖并编译程序,正常运行后会将爬取的文件写到build/geo-china.json中,src/main.rsrust入口文件)
cargo run
  1. 当然cargo还可将rust编译成可执行文件
# 编译成可执行文件
cargo build

# 运行可执行文件
target/debug/geo
image

@xiaoxian521
Copy link
Member Author

rust相关学习资料

Rust 官方文档中文教程

image

@xiaoxian521
Copy link
Member Author

xiaoxian521 commented Nov 29, 2023

有么有类似npmjsrust包管理器

crates.iolib.rs

crates.ioRust编程语言的官方包管理器Cargo的注册表。类似于npmjs.comNode.js包的集中仓库,crates.ioRust crate(包)的集中仓库。Rust开发人员可以从crates.io上传自己的crate供他人使用,也可以下载别人上传的crate来构建自己的应用程序或库。

lib.rs(以前叫做crates.rs)是一个独立的、第三方的Rust crates的索引和搜索门户,其目的是提供比官方crates.io界面更高级的搜索功能和更丰富的信息显示。lib.rs不是一个包注册表,而是一个利用crates.io提供的数据提高用户体验的服务网站,它帮助开发者更容易地找到他们需要的依赖和库。

@xiaoxian521
Copy link
Member Author

xiaoxian521 commented Nov 29, 2023

rust安装环境麻烦,如何通过docker运行rust爬虫程序

我们在项目根目录提供了Dockerfile文件,如果你本地安装了docker环境,确保它已开启,然后执行下面命令

# 创建 geo 镜像(镜像名自定义,创建过程会自动下载项目依赖环境)
docker build -t geo .

# 在 Docker 容器中运行名为 geo 的镜像
docker run geo
image

@xiaoxian521
Copy link
Member Author

地图数据来源哪?

数据来源于高德开放平台

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant