最近,有人,问我,Webpack 4配置,和,Rust语言初探,到底,该选,哪个?

说实话,这个,问题,和,之前,有人,问,Terraform vs ZooKeeper,一样,让我,有点,懵。因为,这两个,完全,不是,一个,领域的,东西。

Webpack 4,是,前端,模块,打包工具,用来,打包,JavaScript,CSS,图片,等,前端,资源。

Rust,是,系统编程语言,用来,写,高性能的,系统级,软件,比如,操作系统,浏览器引擎,游戏引擎,命令行工具,等等。

一个,是,前端,构建工具,一个,是,系统编程语言。两者,完全,不冲突,甚至,经常,一起,出现——比如,现在,很多,前端工具,都,开始,用,Rust,重写了,比如,SWC,Turbopack,等等。

但是,既然,有人,问,说明,大家,可能,对,这两个,的,定位,还,不太,清楚,或者,在,学习,路径上,有,困惑。那,我,就,详细,对比一下,这两个,包括,它们,的,定位,功能,适用场景,优缺点,以及,如何,选择。

希望,这篇,文章,能,帮,大家,搞懂,这两个,以后,不再,纠结。

一、Webpack 4是什么?

先,说说,Webpack 4,是什么。

Webpack,是,一个,现代,JavaScript,应用,的,静态,模块,打包工具。当,Webpack,处理,应用,的时候,它,会,递归地,构建,一个,依赖图,包含,应用,需要的,每个,模块,然后,把,所有,这些,模块,打包成,一个,或,多个,bundle。

简单来说,Webpack,能,把,你的,前端,项目,的,各种,文件,比如,JavaScript,TypeScript,CSS,SCSS,图片,字体,等等,都,处理,和,打包,成,浏览器,能,直接,运行的,静态资源。

Webpack 4,是,Webpack,的,第四个,大版本,在,2018年,发布。它,带来了,很多,改进,比如:

  1. 零配置:Webpack 4,引入了,模式(mode),的,概念,有,development,和,production,两种,模式。不需要,写,复杂的,配置,就能,用,默认,配置,打包。
  2. 性能提升:Webpack 4,的,打包,速度,比,之前的,版本,快了,很多。特别是,production,模式,下,优化,更好。
  3. 内置优化:Webpack 4,内置了,很多,优化,比如,tree shaking,scope hoisting,代码分割,等等。不需要,额外,配置,就能,享受,这些,优化。
  4. 更好的默认值:Webpack 4,的,默认,入口,是,./src/index.js,默认,输出,是,./dist/main.js。不需要,配置,就能,直接,用。

一个,最简单的,Webpack 4,配置,例子:

const path = require('path');

module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader'],
      },
      {
        test: /\.(png|svg|jpg|gif)$/,
        use: ['file-loader'],
      },
    ],
  },
};

这个,配置,定义了,入口,输出,以及,如何,处理,CSS,和,图片,文件。

二、Rust语言是什么?

再,说说,Rust语言,是什么。

Rust,是,一种,系统编程语言,由,Mozilla,研究院,开发,在,2010年,首次,发布。它,的,设计,目标,是,安全,并发,和,性能。

Rust,的,最大,特点,是,内存安全,而,不需要,垃圾回收(GC)。它,通过,所有权(ownership),借用(borrowing),和,生命周期(lifetime),的,概念,在,编译时,保证,内存安全,避免,空指针,悬垂指针,数据竞争,等,问题。

这,让,Rust,既有,C/C++,一样的,性能,又,有,比,C/C++,更高的,安全性。

Rust,的,应用,场景,很,广,包括:

  1. 系统编程:写,操作系统,驱动,嵌入式,软件,等等。
  2. WebAssembly:Rust,是,WebAssembly,的,一等公民,能,把,Rust,代码,编译成,WebAssembly,在,浏览器里,运行,高性能的,代码。
  3. 命令行工具:Rust,编译,出的,二进制,体积小,启动快,性能好,很,适合,写,命令行工具。比如,ripgrep,fd,exa,等等,都是,用,Rust,写的。
  4. 网络服务:Rust,的,异步,生态,越来越,成熟,很,适合,写,高性能的,网络服务。
  5. 游戏引擎:Rust,的,性能,和,安全性,很,适合,写,游戏引擎。

一个,简单的,Rust,程序,例子:

fn main() {
    let numbers = vec![1, 2, 3, 4, 5];
    let sum: i32 = numbers.iter().sum();
    println!("The sum is: {}", sum);
}

这个,程序,计算,一个,数组,的,和,然后,打印出来。

三、两者的核心区别

介绍完了,Webpack 4,和,Rust,各自,是,什么,再,说说,两者,的,核心,区别。

1. 定位不同

Webpack 4,的,定位,是,前端,模块,打包工具。它,是,一个,工具,用来,构建,前端,项目。

Rust,的,定位,是,系统编程语言。它,是,一门,语言,用来,写,各种,软件。

一个,是,工具,一个,是,语言。

2. 领域不同

Webpack 4,属于,前端,开发,的,领域。做,前端,开发,的,人,需要,用,Webpack,来,打包,项目。

Rust,属于,系统编程,的,领域。做,系统编程,底层,开发,高性能,工具,的,人,需要,用,Rust。

3. 学习目的不同

学,Webpack 4配置,的,目的,是,为了,能,配置,和,使用,Webpack,来,打包,前端,项目。这,是,一个,工具,的,使用,技能。

学,Rust语言,的,目的,是,为了,能,用,Rust,写,程序。这,是,一门,编程语言,的,掌握。

4. 难度不同

Webpack 4配置,的,难度,相对,低一些。虽然,Webpack,的,配置,选项,很多,但是,核心,概念,不多,理解了,入口,输出,loader,plugin,这,几个,概念,基本,就,能,用了。

Rust语言,的,难度,相对,高一些。特别是,所有权,借用,生命周期,这些,概念,和,其他,语言,很,不一样,需要,花,一定的,时间,来,理解,和,掌握。

5. 两者不冲突,可以一起学

最重要的,一点,是,Webpack 4,和,Rust,完全,不冲突,甚至,可以,一起学,一起用。

比如,你,是,前端,开发者,你,需要,用,Webpack 4,来,打包,你的,前端,项目。同时,你,也,可以,学,Rust,用,Rust,写,WebAssembly,模块,来,优化,你,前端,项目,的,性能。

或者,你,对,前端工具,感兴趣,你,可以,用,Rust,写,一个,Webpack,的,loader,或者,plugin,来,扩展,Webpack,的,功能。

所以,根本,不存在,"该选哪个",的,问题。两个,都,可以,学,都,可以,用。

四、Webpack 4的优缺点

Webpack 4的优点:

  1. 功能强大:Webpack,能,处理,几乎,所有的,前端,资源,JavaScript,TypeScript,CSS,SCSS,Less,图片,字体,等等,都,能,处理。
  2. 生态丰富:Webpack,有,海量的,loader,和,plugin,几乎,你,能,想到的,功能,都,有,对应的,loader,或,plugin。
  3. 社区活跃:Webpack,的,社区,非常,活跃,遇到,问题,很,容易,找到,答案。
  4. 零配置起步:Webpack 4,的,零配置,让,初学者,能,很快,上手,不需要,写,复杂的,配置。
  5. 代码分割:Webpack,支持,代码分割,能,把,代码,拆成,多个,bundle,按需加载,优化,首屏,加载,速度。
  6. 热模块替换:Webpack,支持,热模块替换(HMR),开发的时候,修改,代码,不用,刷新,页面,就能,看到,效果,开发,体验,好。

Webpack 4的缺点:

  1. 配置复杂:虽然,Webpack 4,有,零配置,但是,真正,做,项目,的时候,还是,需要,写,不少,配置。配置,选项,很多,初学者,容易,晕。
  2. 打包速度:虽然,Webpack 4,比,之前的,版本,快了,很多,但是,对于,大项目,打包,速度,还是,有点,慢。特别是,production,模式,下,需要,做,各种,优化,打包,时间,更长。
  3. 文档不够友好:Webpack,的,文档,虽然,内容,全,但是,组织,得,不太,好,初学者,不容易,找到,需要的,信息。
  4. 版本升级痛苦:Webpack,的,大版本,升级,经常,有,breaking changes,配置,需要,改,很多,plugin,和,loader,也,可能,不兼容,升级,比较,痛苦。

五、Rust的优缺点

Rust的优点:

  1. 性能高:Rust,的,性能,和,C/C++,相当,没有,垃圾回收,的,开销,运行时,很小。
  2. 内存安全:Rust,在,编译时,保证,内存安全,避免,空指针,悬垂指针,缓冲区溢出,等,常见的,内存,问题。
  3. 并发安全:Rust,的,类型系统,和,所有权,机制,能,在,编译时,避免,数据竞争,写,并发,程序,更,安全。
  4. 现代的语言特性:Rust,有,很多,现代的,语言特性,比如,模式匹配,泛型,trait,闭包,迭代器,等等,表达力,强。
  5. 工具链完善:Rust,有,很好的,工具链,cargo,包管理,和,构建工具,很好用。rustup,版本管理,很方便。rustfmt,代码格式化,clippy,代码检查,都,内置了。
  6. 生态快速发展:Rust,的,生态,虽然,还,不如,C/C++,Java,等,老牌语言,成熟,但是,发展,很快,很多,领域,都,有,不错的,库。
  7. WebAssembly支持好:Rust,和,WebAssembly,的,集成,非常,好,是,WebAssembly,的,首选,语言。

Rust的缺点:

  1. 学习曲线陡峭:Rust,的,所有权,借用,生命周期,这些,概念,和,其他,语言,很,不一样,初学者,需要,花,很多,时间,来,理解,和,掌握。
  2. 编译时间长:Rust,的,编译,时间,相对,长一些,特别是,大项目,编译,可能,需要,比较,久。
  3. 生态还不够成熟:虽然,Rust,的,生态,发展,很快,但是,在,很多,领域,还是,不如,老牌语言,成熟。比如,GUI,机器学习,等,领域,的,库,还,不够,丰富。
  4. 动态语言特性少:Rust,是,静态类型,语言,没有,反射,动态类型,等,特性,某些,场景,下,开发,效率,不如,动态语言。
  5. 招聘难:Rust,的,使用者,相对,少,招聘,Rust,开发者,比较,难。如果,公司,要用,Rust,可能,需要,自己,培养。

六、到底该怎么选?

最后,回到,最初的,问题:Webpack 4配置,和,Rust语言初探,到底,该选,哪个?

我的,回答,是:看你的,需求,和,目标。

如果你是前端开发者,或者,正在做前端项目:

那,Webpack 4配置,是,你,必须,掌握的,技能。因为,现在,前端,项目,基本,都,用,Webpack,来,打包。你,需要,懂,Webpack,的,配置,才能,构建,和,优化,你的,前端,项目。

这,时候,Webpack 4,是,刚需,先,学,它。

如果你对系统编程,底层开发,高性能工具感兴趣:

那,Rust,是,一个,很好的,选择。它,能,让你,写出,高性能,高安全的,系统级,软件。

这,时候,Rust,是,你,想,探索的,方向,学,它。

如果你两者都需要,或者,都感兴趣:

那就,都,学。两者,完全,不冲突,甚至,可以,相辅相成。

比如,你,先,学,Webpack 4,把,前端,构建,搞定,然后,再,学,Rust,用,Rust,写,WebAssembly,优化,前端,性能,或者,写,前端工具。

学习,从来,都,不是,二选一的,事情。技多不压身,多学,一门,技能,总是,好的。

如果你是初学者,不知道该学什么:

那,建议,先,想清楚,你,的,目标,是什么。你,想,做,前端,开发?还是,想,做,系统,编程?还是,想,做,其他,什么?

根据,你的,目标,来,决定,学什么。不要,盲目,跟风,看,什么,火,就,学什么。

而且,学习,要,专注,不要,同时,学,太多,东西,结果,什么,都,学不精。先,把,一个,东西,学好,学精,再,学,其他的。

七、写在最后

以上,就是,Webpack 4配置,和,Rust语言初探,的,详细,对比。

总结,一下:

  • Webpack 4,是,前端,模块,打包工具,用来,构建,前端,项目。
  • Rust,是,系统编程语言,用来,写,高性能的,系统级,软件。
  • 两者,完全,不是,一个,领域的,不存在,"该选哪个",的,问题。
  • 根据,你的,需求,和,目标,来,决定,学什么。需要,哪个,就学,哪个,都,需要,就,都,学。

希望,这篇,文章,能,帮,大家,搞懂,这两个,以后,不再,纠结。

如果,有,什么,问题,或者,不同的,看法,欢迎,在,评论区,留言,我们,一起,交流。