02学习 webpack 前,你需要了解的那些概念

wepback作为前端最热门的打包管理工具之一,学习一下是很有必要的,关于webpack的学习教程很多,并且官方也有对应的中文文档,所以本篇文章不再讲解如何使用webpack,而是重点讲解学习webpack前需要了解的一些概念。

什么是webpack

关于什么是webpack,一般的教程里面都会提到webpack是一个模块化打包工作,但是很多初学者没有模块化这个概念,所以往往在第一步就被拦住了。所以在讲什么是webpack之前,我想先讲一下和模块化相关的概念。

javascript的运行环境

因为我们平时写的js代码都在浏览器中运行,所以可能会造成一个错觉,那就是js代码只能在浏览器中运行,其实浏览器只是js的一个运行环境,除了在浏览器,还可以在服务器上运行,也就是node环境,感兴趣的可以自己下载node.js试一下,在node.js里面可以直接运行js代码。所以有些语法在浏览器里面并不支持,比如es6的module,即使在最新的浏览器里面也不行,这些语法只能在node环境中运行,直接在浏览器中使用会报错。

什么是模块化?

在讲模块化之前,我们先复习一下less,我们在a.less文件中定义了一个颜色变量@white:#fff,现在我在b.less中想用到这个@white变量应该怎么办呢?使用@import 'a'就可以了。在上面那段less代码中,其实我们就用到了模块化编程,只不过是基于less的。现在我们再来看一下js如何实现模块化编程。
传统的写法比较简单,就是把自己需要的js文件全部放到index,html中引入,在引入的时候还需要确保引入的顺序是正常的,本质上来说,就是把所有代码全部引入到一个js文件中。而现在我们采用模块化的写法,就会相对来说结构清晰一点,比如在main.js里面需要使用jquery,那么我们可以在main.js里面这么写:import $ from "jquery",在index.html里面只需要引入main.js即可,采用这种写法可以让文件间的依赖关系更加清楚,实现按需加载,同时结构也会更加合理。

JS的模块规范有哪些

在es6之前,主要采用AMD和CMD这2中规范,AMD规范比较好的一个实现库是require.js,CMD对应的是seajs,还有一点node.js也是符合CMD规范的,所以cmd规范的代码可以直接在node环境下运行。而js的最新版本es6则提供了原生的module语法,以实现对模块化的支持
CMD语法:

// 定义模块
module.exports =function(){
  vargreet =document.createElement('div');
  greet.textContent ="Hi there and greetings!";
  returngreet;
};
//引用模块
let greeter =require('./Greeter.js');

ES6语法:

//定义模块
etdog="我爱哈士奇"
export default dog
//引用模块
import dog from 'animal'

webpack干了什么

上面已经提到这些模块化的语法是不能在浏览器环境中运行的,所以我们需要这些将这些互相依赖的文件进行编译(打包),编译成浏览器能够运行的代码。而webpack做的就是这个打包操作,比如我们在main.js里面依赖了add.js文件,而add.js文件使用import $ form 'jquery'
,那么webpack会发现main.js需要add.js,然后将add.js导入,导入add.js的时候发现add.js需要jquery,然后又将jquery给导入,最后生成了一个总的js文件,这样我们的代码就可以到浏览器环境上运行了。

webpack与es6

es6提供了很多激动人心的新特性,但是这些新特性并不被所有的浏览器支持,为了使用这些新特性,我们可以使用babel插件,将我们的代码es6代码转换成es5代码。但是对于一些es6新的api,比如promise等,需要使用babel-polyfill,而如何使用babel-polyfill呢?只要在需要对es6转换成es5的文件头部加上import 'babel-polyfill';
很明显,这是es6的模块语法,表示这个文件依赖babel-profill这个文件,所以我们需要使用打包工具来进行打包,这样才能运行这段代码。所以,想要学习es6,webpack是必须要迈过去的一道坎。

如何学习webpack

谈了这么多,总算要到如何学习了。学习资料的话,可以去看一些已经整理好的资料或者官网的文档,了解config的基本语法就可以开始撸了。这里推荐一个练手的项目:多动症简历。这是一个很有意思的项目,里面用到了es6+promise+webpack,如果你能将这段代码进行打包,并实现以下几个要求,那么你webpack可以说是入门了。如果你对这个多动症简历项目感兴趣,可以去看一下项目作者的这篇文章:用原生js写一个"多动症"的简历,推荐直接阅读项目的源代码,从中可以学到很多知识。

  • 使用babel-loader将es6转换成es5
  • 将css单独的打包成一个文件
  • 压缩js代码
  • 压缩css代码

使用html模板生成index.html至于上面这些功能如何实现,需要用到哪些插件,希望你能自己去百度,去google,去stackoverflow。只有自己练过,才算彻底掌握,如果只是简单的跟着官网项目做几个简单的demo,其实没什么意义。

踩坑记录

这是我在使用webpack时遇到的一些坑,webpack的版本号是3.0,如果你也遇到了,可以参考一下下面的解决方案。使用extract-text-webpack-plugin
生成单独的css时,可能会报错chunk.sortModules is not a function
,解决方案是回退extract-text-webpack-plugin版本号到2.1.2,npm i extract-text-webpack-plugin@2.1.2
。一般的压缩js插件无法压缩es6,如果想对es6代码进行压缩,可以使用UglifyjsWebpackPlugin。但是如果教程一步一步来还是会报错Unexpected token: name (doc)
。解决方案是将babel配置拿出来,不要放在webpack.config中,单独的放到.babelrc中。使用了extract-text-webpack-plugin
后无法进行css压缩?可以使用optimize-css-assets-webpack-plugin这一插件来解决。

webpack和gulp有什么区别

两者虽然在某些功能上类似,比如都可以压缩代码,编译less等。但是两者的定位不同,刚才也提到过了,webpack本质上是一个打包工具,支持CMD的语法,将多个互相依赖的js文件打包成一个js文件。而gulp则是一个自动化工具,用来处理less编译,代码压缩这些,gulp的核心概念是管道,所有文件在管道中流通,然后在流的过程中依次进行代码压缩,less编译等操作,最后再将这些文件流输出到指定目录。所以两者在功能以及定位上都有很大的不同。

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

推荐阅读更多精彩内容