webpack2使用心得

(本文章还在持续更新中。。。。)
使用webpack做构建也有一段时间了,记录一下使用webpack的心得。
我们来看看官网对webpack的描述。

webpack is a module bundler for modern JavaScript applications. When webpack processes your application, it recursively builds a dependency graph that includes every module your application needs, then packages all of those modules into a small number of bundles - often only one - to be loaded by the browser.
It is incredibly configurable, but to get started you only need to understand Four Core Concepts: entry, output, loaders, and plugins.
This document is intended to give a high-level overview of these concepts, while providing links to detailed concept specific use-cases.

简单来说,webpack是一个现代js应用的模块管理器。他能正确处理模块的依赖方式,并且把多个模块打包成浏览器识别的小数量文件(通常来说只有一个文件,但是如果采用异步加载或者代码拆包的化就有多个了),webpack是基于配置式的,最核心的四个参数是入口、出口、模块加载器和插件。

入口、出口都好理解,我这里要补充一下output的publicPath参数。默认为/,它是主文件加载其他文件时的路径前缀。比如你构建时产生了多个js文件,主文件是app.js。app.js加载其他文件时,会在路径前面补全publicPath。

loaders是用于处理不同的文件。因为webpack是基于nodejs的,而nodejs默认只能识别js文件,所以less、json等文件需要相应的loader来将文件转换成js。loaders具有如下特点:

  • 支持链式调用,有先后顺序,前一个loader的返回作为下一个loader的输入
  • 最终要生成js
    常用的loader总结如下:
  • file-loader用于生成md5命名的文件
  • url-loader 将文章转换成dataurl的方式
  • css-loader加载css文件。可以解析里面的import,css模块化。soucemap等
  • style-loader将js化的css包裹style标签,并嵌入到html中,一般配合css-loader使用
  • ts-loader解析typescript
    ...

plugin

如果说loader是对具体资源类型上对资源文件的转换扩展。那么plugin则相当于在全局上做扩展。官方推荐plugin插件一览表
如果有多个chunk共享相同的依赖,我们可以用CommonsChunkPlugin来提取相同的依赖性到当独的文件

resolve

这个配置很实用。在处理模块依赖关系的时候,涉及到嵌套比较深的文件,我们很可能会写出这样的代码

import Utility from '../../utilities/utility';

通过resolve.alias就可以设置一个别名,正确的让webpack从该路径中查找

alias: {
  Utilities: path.resolve(__dirname, 'src/utilities/')
}

通过resolve.modules可以指定node_modules的查找路径,适用于一个大项目嵌套多个小项目的情况,可以让小项目共享相同的node_modules,但是如果是同一个包的不同版本,则不可用。

webpack的Code Splitting async

当你的代码打包后仍很大的时候,你就要考虑进行代码拆包了。把一些没有必要立刻加载的代码拆包,并异步去加载。在webpack中,你可以通过import()和require.ensure来实现
import是es6的一个特性,在webpack中。webpack会把import()命令识别成代码切割的点(记住,import后面有括号包裹,包裹的为要加载的模块路径),而且webpack的import异步加载模块是基于promise,这意味着低版本浏览器你需要加promise的polyfill。
而且import()需要你正确处理依赖项,因为webpack只是单纯的将模块当独拆包。如果需要处理依赖关系的化,还是使用require.ensure比较合适。

webpck打包项目中包括第三方库

在webpack打包中,经常会遇到引用第三方库的情况,这时候你可以将代码打包成三块(不包括拆包生成的小chunk)
1.webpack的模块引入代码。主要是webpackJsonp的实现和共同的代码块。
2.第三方库
3.主要的业务代码
要实现上述的三种分离。需要用到CommonsChunkPlugin来分离多次引用的chunk。用DllReferencePlugin和DllPlugin来分离第三方应用。
不过不建议通过这种方式打包第三方依赖库,还是直接使用第三方库提供的dist版本吧,直接打包生成的可能是开发中版本而不是release版本。

externals的使用场景

如果在wepack中定义了externals,webpack会在import、require的时候忽略对应模块,并externals中对应模块的值赋给模块。也就是说,该模块不会被打包进去最终的代码。比如你externals设置了

并在代码中对jquery进行了引用

import jquery from "jquery"

webpack在打包的时候会在externals中匹配到jquery,从而只是简单的进行变量替换

image.png

要注意的

webpack使用场景

1.处理代码依赖。当你项目复杂,需要引入许多静态资源,而且静态资源有依赖关系,优先关系时
2.代码的并包(多个静态资源合并,在进行模块化开发一定会用到)
3.代码的拆包(当你的资源需要多个页面复用而需要把共同的代码分离,以便用于浏览器缓存时。)
4.代码构建,需要区分不同的生成环境时。(比如最常见的三层环境。开发环境、测试环境、线上环境。你可以在开发环境搭建hmr来提高编译效率,在测试环境使用soucemap来方便测试debug,在线上环境压缩混淆版本管理来减小带宽消耗和利用缓存)

webpack调用方式

1.通过cli的方式(在终端中使用webpack命令,适合单独文件需要简单处理的时候使用)
2.通过nodejs 的api方式 (适合多环境搭建的时候使用,比如区分开发环境、测试环境、线上环境等,如何区别?在cli中不同的命令指向不同的配置文件,不同的配置文件用define-plugin定义环境变量,在代码中就可以直接使用这个变量了)

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

推荐阅读更多精彩内容

  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,121评论 7 35
  • GitChat技术杂谈 前言 本文较长,为了节省你的阅读时间,在文前列写作思路如下: 什么是 webpack,它要...
    萧玄辞阅读 12,649评论 7 110
  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,258评论 4 31
  • 喜欢篮球的人应该对于科比·比恩·布莱恩特如雷贯耳,他是NBA最好的得分手之一,突破、投篮、罚球、三分球他都驾轻就熟...
    与与我无关阅读 451评论 1 1
  • 前两天刷微博看到这样一句话: 学长学姐告诫学弟学妹们: 一定要在大学去尝试一场校园恋爱,不管结果如何,至少你爱过,...
    一步之遥工作室阅读 537评论 0 0