前端的这一堆工具到底是在干嘛?

Modern JavaScript Explained For Dinosaurs

原文:Modern JavaScript Explained For Dinosaurs
Images from Dinosaur Comics by Ryan North

学习node、npm、grunt、gulp、webpack、babel......等等一些列工具会让人觉得很艰难,如同原始人从原始社会直接跳到了现代社会,见到了高楼大厦拔地而起一样,大写的懵逼。 原因大概是生态环境变化太快,让萌新不能一下就深刻理解这些不同的工具对应的、要解决的问题是什么。(因为没有遇到过,而解决方案是被封装好的,只知道用工具。)
这篇文章就是要理清楚这些脉络,让萌新知道Why and How这些工具是怎么一步步进化(evolved)的。

Using JavaScript the “old-school” way

让我们穿梭时空回到过去,用复古风格,走起。

index.html中引用JavaScript文件:

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>JavaScript Example</title>
  <!--first-->
  <script src="moment.min.js"></script>
</head>
<body>
  <h1>Hello from HTML!</h1>
</body>
</html>

<script src="index.js"></script>引入了同目录下名为index.js的JS文件,内容为:

// index.js
console.log("Hello from JavaScript!");

如果要引用如moment.js的第三方库,需要去官方网站下载moment.min.js(不要忘记现在穿越了,npm这种东西是不存在的,所以忽略右边的install吧)
[图片上传失败...(image-64c53-1510588571998)]
然后手动将它放在index.js同目录下,并且在index.html中引用:

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Example</title>
  <link rel="stylesheet" href="index.css">
  <!--second-->
  <script src="moment.min.js"></script>
  <!--first-->
  <script src="index.js"></script>
</head>
<body>
  <h1>Hello from HTML!</h1>
</body>
</html>

而且重点是,要记住引用顺序,moment.min.jsindex.js之前,这样在index.js中引用moment()才不会报没有定义的错,如下:

// index.js
console.log("Hello from JavaScript!");
console.log(moment().startOf('day').fromNow());

要用第三方库就要先引入,很好理解对吧。不过好气啊,每当要更新第三方库版本的时候就又要去各自的官方网站点点点点点点,剪切然后粘贴,烦。能不能简单点?能,进化。

Using a JavaScript package manager (npm)

(包管理器的概念主要来自BackEnd,但是作为一个有着卓越软件工程师梦想的年轻人,不会命令行说不过去啊朋友,还不赶快来两发)

JavaScript包管理器,负责自动从中央仓库下载和更新。npm、yarn、bower的混战,略去不讲。

npm根据package.json里的描述来完成包的管理。
这个过程是通过npm init回答几个问题,最终得到package.json

 {
  "name": "your-project-name",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

再运行$ npm install moment --save,代表着将moment下载到./node_modules文件夹的同时将这个记录插入到package.json"dependencies"

{
  "name": "modern-javascript-example",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "moment": "^2.19.1"
  }
}

与他人协作的时候只需要共享这一份描述文件,依赖的包会从中央仓库下载。接下来还需要更改index.html当中的引用

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>JavaScript Example</title>
  <script src="node_modules/moment/min/moment.min.js"></script>
  <script src="index.js"></script>
</head>
<body>
  <h1>Hello from HTML!</h1>
</body>
</html>

这样更新就只需要动package.json里的版本号,是不是很棒(๑•̀ㅂ•́)و✧?但是一旦增加引用或者删除引用还要去html文件里修改,仍然很麻烦,能不能再自动化把这点也处理了,省点力?能,进化。
[图片上传失败...(image-a92fca-1510588571998)]


(这里的坑感觉已经不想填了)


Using a JavaScript module bundler (webpack)

使用模块打包器
JavaScript最开始就没打算搞大新闻,所以也就真的没有设计一般程序设计语言的导包的特性。一般引入js文件就算导包了,全局变量就可以随便调用内里的变量,函数了。
由入口index.js查找所有的依赖,拼接到bundle.js,只需要在html中引入这一个。

Transpiling code for new language features (babel)

转译器,可以使用新的语言特性来提高开发效率,同时又可以在未支持的平台有效运行。

Using a task runner (npm scripts)

重复的工作可以自动完成,当文件改动后,执行一系列脚本。

结论

  • 包管理
  • 模块打包
    • 转译
    • 自动化构建

现代的开发方式,让开发者能专注于功能的实现。webpack进化到现在(2017年)似乎已经不仅仅是一个打包工具了,更是提供了一套完整的前端开发解决方案。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 最近在学习 Webpack,网上大多数入门教程都是基于 Webpack 1.x 版本的,我学习 Webpack 的...
    My_Oh_My阅读 8,184评论 40 247
  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,164评论 7 35
  • 1. 新建一个文件夹,命名为 webpack-cli , webpack-cli 就是你的项目名,项目名建议使用小...
    鲁大师666阅读 1,476评论 1 3
  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,287评论 4 31
  • (抓人) 尖锐的警笛声划破寂静的夜,我们的车队正飞速的开着,瘦猴告诉我们,他在市精神病医院里面,查到了一些东西,果...
    会飞的豆子阅读 564评论 0 0