嘿,我最近接到一个 Web 项目,不过老实说,我这两年没怎么接触 Web 编程,听说 Web 技术已经发生了一些变化。听说你是这里对新技术最了解的 Web 开发工程师?
准确地说,我是一名「前端工程师」。不过你算是找对人了。我对今年的技术别提多熟了,前端可视化、音乐播放器、能踢足球的无人机,你尽管问吧。我刚去 JS 大会和 React 大会逛了一圈,没有什么新技术是我不知道的。
厉害。是这样的,我要开发一个网页,用来展示用户的最新动态。我想我应该通过后端接口获取数据,然后用一个 table 来展示数据,用户可以对数据进行排序。如果服务器上的数据变化了,我还需要更新这个 table。我的思路是用 jQuery 来做。
可别用 jQuery!现在哪还有人用 jQuery。现在是 2016 年了,你绝对应该用 React。
哦,好吧,React 是什么?
React 是一个非常厉害的库,Facebook 的牛人写的。它能让页面更可控,性能极高,而且使用起来很简单。
听起来确实不错。我能用 React 展示服务器传来的数据吗?
当然可以,你只需要添加两个依赖,一个是 React,一个是 React DOM
额,等下,为什么是两个库?
React 是我说的库,React DOM 是用来操作 DOM 的。因为这些 DOM 是用 JSX 写的,所以需要一个专门的库来操作。
JSX?JSX 是什么?
JSX 是对 JS 的扩展,它看起来跟 XML 差不多,可以用来写 HTML,你可以认为 JSX 是一种更优雅的 HTML 写法。
为什么不用 HTML 了……?
现在可是 2016 年啊,没有直接写 HTML 的。
对哦。好吧,加了这两个依赖,是不是就可以开始用 React 了?
不行哦。你需要添加 Babel,然后才能用 React。
Babel 是另一个库?
嗯,Babel 是一个转译工具,Babel 能把你写的 JS 转译成任意版本的 JS。你不一定非要用 Babel,但是如果你不用的话,你就只能写 ES5 的语法了。你知道的,现在是 2016 年,你怎么能不使用 ES2016+ 的语法呢?ES2016+ 多么酷啊。
ES5 是啥?ES2016+ 又是啥?我有点晕。
ES5 就是 ECMAScript 5。大部分人都会使用 ES5,因为大部分浏览器都支持 ES5。
ECMAScript 是啥……
你晓得的,JS 是 1995 年诞生的,而 JS 的标准是 1999 制定出来的。那时候 JavaScript 还叫做 Livescript,只能运行在网景的浏览器里。那时真是混乱的年代,现在好了,我们有了 JS 的 7 个版本的规范。
7 个版本?那 ES5 和 ES2016+ 是?
分别是第 5 个版本和第 7 个版本。
诶,那第六个版本呢?
你说的是 ES6。每个版本都是上一个版本的超集,所以你直接使用最新的 ES2016+ 就好了。
对哦。为什么不用 ES6 呢?
好吧,你可以用 ES6,但是你就用不到 async 和 await 这么酷的语法了。用 ES2016+ 比较好。用 ES6 的话你就只能用 generator 来控制异步任务流了。
不知道你在说什么……你说了太多我听不懂的名词了。我只是想从服务器取点数据,我以前用 jQuery 挺好的,从 CDN 引入 jQuery,我就能用 AJAX 获取数据了,现在不能这样做吗?
大哥,都 2016 年了,没人用 jQuery 好吗。所有人都知道用 jQuery 只会造出「意大利面条」一样的代码(不可维护)
好吧,所以我现在要加载三个库才能获取并展示数据。
对的,其实你可以用「模块管理器」把这三个库「打包」成一个文件。
哦,什么是模块管理器……
不同平台的模块管理器不同啦。前端的模块管理器一般指管理 AMD 或者 CommonJS 模块的东西。
好……吧,什么是 AMD 和 CommonJS?
是两个定义。我们有很多方式来描述 JS 中多个库或类的交互方式,比如 exports 和 requires。你可以按照 AMD 或者 CommonJS 的 API 来书写 JS,然后用 Browserify 将它们打包。
听起来很有道理。不过,什么是 Browserify?
是一个工具,用来将 CommonJS 形式的 JS 文件打包起来,放到浏览器里运行。用 npm 仓库的人发明了 CommonJS。
npm 仓库是什么……
是一个公开的仓库,用于放置可依赖的模块。
就像一个 CDN 么?
不太一样。它更像是一个数据库,每个人都能在上面发布代码,也能下载上面的代码。你可以在开发的时候将这些代码下载到本地来使用,必要的时候也能上传到 CDN。
听起来像是 Bower!
是的,不过现在是 2016 年了,没有人用 Bower 了……
好吧,我知道了,所以我应该用 npm 来安装依赖。
对的。我举个例子吧,如果你要使用 React,你直接用 npm 安装 React,然后在代码里导入 React 就可以了。大部分 JS 库都能这么安装。
嗯,Angular 也可以。
Angular 是 2015 年的事情了。不过今年 Angular 还没死,还有 VueJS 和 RxJS 等等,你想学一学么?
还是用 React 吧。我刚才已经学了够多东西了。所以我用 npm 安装 React 然后用 Browerify 来打包就好了?
是的。
这么做看起来有点过于复杂啊。
确实。这就是为什么你应该使用 Grunt、Gulp 或者 Broccoli 这样的任务管理工具,它们能自动运行 Browserify。不对,你现在可以用 Mimosa。
你在说什么……
任务管理工具。不过我们现在已经不用了。去年我们还在用,后来改成了 Makefiles,但是现在我们用的都是 Webpack。
我以为只有 C/C++ 项目才会用 Makefiles。
是的,不过显然我们做 Web 开发的,喜欢先把事情搞复杂,然后回归到最朴素的状态。每年我们都是这么搞的。你就看着吧,过不了两年,我们就可以在网页上写汇编了。
唉,你刚才说的 Webpack 是什么?
另一种模块管理工具,同时也是一个任务管理工具。你可以认为它是 Browserify 的加强版。
哦,好吧,为什么 Webpack 是加强版?
额,可能并没有加强吧。Webpack 告诉你应该如何管理你的依赖,Webpack 允许你使用不同的模块管理器,不只是 CommonJS,甚至支持 ES6 模块。
这都是哪跟哪啊,我都被绕晕了。
大家都被绕晕了,不过等 SystemJS 出来了就好了。
天呐,又一个 JS 库,这是什么鬼?
呵呵,不像 Browserify 和 Webpack 1.x,SystemJS 是一个动态的模块加载器。
等下,刚才不是说应该把所有依赖打包成一个文件吗?