深入浅出Webpack 摘要 Plugin & DevServer

Plugin

Plugin 用于扩展 Webpack 的功能 , 各种各样的 Plugin 几乎可以让 Webpack 做任何与构建相关的事情。使用 Plugin 的难点在于掌握 Plugin本身提供的配置项 ,而不是如何在 Webpack 中接入 Plugin

Plugin的配置很简单, plugins配置项接收一个数组,数组里的每一项都是一个要使用 的 Plugin 的实例, Plugin 需要的参数通过构造函数传入 。

const CommonsChunkPlugin =require('webpack/lib/optimize/CommonsChunkPlugin');

module.exports = {
  plugins: [
    new CommonsChunkPlugin({
      name: 'common',
      // 可以是存在的chunk (entry chunk) 否则会创建name为common的chunk进行合并公共代码
      chunks: ['a', 'b']
      // 指定从哪些chunk当中去找公共模块,省略该选项的时候,默认就是entry chunks
    })
  ]
}

DevServer

要配置 DevServer,除了可以在配置文件里通过 devServer 传入参数,还可以通过命令行参数传入。注意,只有在通过 DevServer启动 Webpack时,配置文件里的 devServer 才会生效,因为这些参数所对应的功能都是 DevServer提供的 ,Webpack 本身并不认识 devServer 配置项。

hot

devServer.hot 配置是否启用模块热替换功能。 DevServer 的默认行为是在发现源代码被更新后通过自动刷新整个页面来做到实时预览,开启模块热替换功能后,将在不刷新整个页面的情况下通过用新模块替换老模块来做到实时预览

historyApiFallback

当使用 HTML5 History API 时,任意的 404 响应都可能需要被替代为 index.htmldevServer.historyApiFallback 默认禁用。通过传入以下启用:

module.exports = {
  //...
  devServer: {
    historyApiFallback: true
  }
};

如果我们的应用由多个单页应用组成且使用HTML5 History API 时 ,则需通过传入一个对象,比如使用 rewrites 这个选项,此行为可进一步地控制:

module.exports = {
  //...
  devServer: {
    historyApiFallback: {
      rewrites: [
        { from: /^\/$/, to: '/views/landing.html' },
        { from: /^\/subpage/, to: '/views/subpage.html' },
        { from: /./, to: '/views/404.html' } 
        // 除上面两个都返回外都返回404页面
      ]
    }
  }
};
contentBase

devServer.contentBase配置 DevServerHTTP服务器的文件根目录。在默认情况下为当前的执行目录,通常是项目根目录,所以在一般情况下不必设置它,除非有额外的文件需要被 DevServer服务。 例如,若想将项目根目录下的 public 目录设置成 DevServer服务器 的文件根目录,则可以这样配置。

devServer:{
  contentBase : path.join(__dirname, 'public')
}

DevServer服务器通过 HTTP 服务暴露文件 的方式可分为两类 :第一类,暴露 Webpack 构建出的结果,由于构建出的结果交给了 DevServer,所以我们在使用 DevServer 时,会在本地找不到构建出的文件。第二类就是暴露本地文件,contentBase 就是用配置暴露本地文件规则的,也可以设置false来关闭。

headers

devServer.headers 配置项可以在 HTTP 响应中注入 一些 HTTP 响应头

devServer: { 
  headers: {
    'X-foo':'bar'
  }
}
host port allowedHosts

devServer.host 配置项用于配置 DevServer服务监听的地址,devServer.host 配置项用于配置 DevServer 服务监听的端口。

devServer.allowedHosts 配置一个白名单列表,只有 HTTP请求HOST 在列表里才正常返回,使用如下:

allowedHosts: [ 
  // 匹配单个域名
  'host. com',
  'sub.host.com',
  // host2.com 和所有的子域名 *.host2.com 都将匹配
  '.host2.com'
]
https

DevServer默认使用HTTP服务, 它也能使用HTTPS服务。在某些情况下我们必须使用 HTTPS,例如HTTP2ServiceWorker就必须运行在HTTPS上。要切换成 HTTPS服务,最简单的方式是:

devServer: {
  // 会自动为我们生成一份 HTTPS 证书。
  https : true
  // 如果我们想用自己的证书, 则可 以这样配置 :
  https: {
    key: fs.readFileSync('path/to/server.key'), 
    cert: fs.readFileSync ('path/to/server.crt') , 
    ca: fs.readFileSync ('path/to/ca.pem')
  }
}
open

devServer.open 用于在 DevServer 启动且第一次构建完时,自动用我们的系统的默认浏览器去打开要开发的网页 。还提供了 devServer.openPage 配置项来打开指定URL的网页 。

before

在服务内部的所有其他中间件之前, 提供执行自定义中间件的功能。 这可以用来配置自定义处理程序,例如: 在后端接口没写好前本地开发调试拦截请求返回mock数据

module.exports = {
  //...
  devServer: {
    before: function(app, server) {
      app.get('/some/path', function(req, res) {
        res.json({ custom: 'response' });
      });
    }
  }
};

其他配置项

target

JavaScript 的应用场景越来越多,从浏览器到 Node.js,这些运行在不同环境中的 JavaScript 代码存在一些差异。 target配置项可以让 Webpack构建出针对不同运行环境的代码。
默认值为'web',还有'node' 'async-node' 'webworker'`` 'electron-main' 'electron-renderer'

Devtool

devtool 配置 Webpack如何生成 Source Map, 默认值是 false,即不生成 Source Map,若想为构建出的代码生成 SourceMap 以方便调试,则可以这样配置: devtool: 'source-map'

Watch 和 WatchOptions

Webpack支持监听文件更新,在文件发生变化时重新编译。 在使用 Webpack 时 ,监听模式默认是关闭的 (在使用devServer时默认是开启的),watchOptions 配置项用来更灵活地控制监听模式。

module.exports = {
  //只有在开启监听模式时, watchOptions 才有意义
  watch: true,
  watchOptions: {
    //不监听的文件或文件夹,支持正则匹配
    //默认为空
    ignored: /node_modules/,
    //监听到变化后会等 300ms 再去执行动作,防止文件更新太快导致重新编译频率太高 
    //默认为 300ms
    aggregateTimeout: 300,
    //默认每秒询问1000次系统(轮询),用来确定指定文件有没有变化 
    poll: 1000
  }
}
Externals

Externals 用来告诉在 Webpack 要构建的代码中使用了哪些不用被打包的模块,也就是说这些模板是外部环境提供的, Webpack在打包时可以忽略它们。

例如在我们的 HTML HEAD 标签里通过以下代码引入 jQuery:

<script src="path/to/jquery.js"></script>

如果想在使用模块化的源代码里导入和使用 jQuery,则可能 需要这样:

import $ from 'jquery');
$('.my-element');

构建后我们会发现输出的 Chunk 里包含的 jQuery 库的内容,这导致 jQuery 库出现了两次,通过 externals 可以告诉 WebpackJavaScript 运行环境中已经内置了哪些全局变量,不用将这些全局变量打包到代码中而是直接使用它们。


module.exports = { 
  externals : {
    //将导入语句里的 jquery 替换成运行环境里的全局变量 jQuery !!!
    jquery : 'jQuery'
  }
}
Resolveloader

ResolveLoader 用来告诉 Webpack 如何去寻找 Loader,因为在使用 Loader时是通过其包名称去引用的,Webpack 需要根据配置的 Loader 包名去找到 Loader 的实际代码,以调用Loader去处理源文件。

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

推荐阅读更多精彩内容

  • 模块化 模块化是指把一个复杂的系统分解到多个模块以方便编码。 缺点 命名空间冲突,两个库可能会使用同一个名称,例如...
    Upcccz阅读 594评论 0 3
  • 入门介绍 为什么选择webpack 大多数团队在开发新项目时会采用紧跟时代的技术,这些技术几乎都会采用“ 模块化+...
    一米阳光kk阅读 2,315评论 0 9
  • 学习流程 参考文档:入门Webpack,看这篇就够了Webpack for React 一. 简单使用webpac...
    Jason_Zeng阅读 3,134评论 2 16
  • 一、入门loader可以看作是翻译员,配置module.rules数组里的规则,告诉webpack遇到哪些文件使用...
    zx_lau阅读 2,996评论 0 0
  • 孩子: 我知道你很想玩手机,因为它很好玩,如果是我,我也会忍不住去玩你的。这种心理,我是可以理解的。但是我告...
    倬成阅读 251评论 0 1