webpack 是一个预编译模块打包工具,它只会对使用到的模块进行打包。

一个模块是否被使用?可以根据该模块是否被 require 来判断。如果require时指定的是具体的模块名称与正确的路径,那么 webpack 便可以在编译打包时正确的引用到该模块。

require('tools'); //preset alias tools
require('./js/main');

如果 require的只是一个表达式(即需要运算才能得到结果),对于 webpack而言结果就不会精确了。

require('./img/' + name + '.jpg');

由变量 name 结合常量 ./img/.jpg 等构成的一个表达式,其最终的结果是需要执行才会得知的,但是 webpack本身又是一个预编译的打包工具,因此这里 webpack并不知道你最终会打包那个模块,所以在打包时就需要自己分析并提取出如下的关键信息:

  • directory : ./img
  • Regular expression : /^.*.jpg$/

当你在请求一个含有表达式的模块时,webpack并不能预先精准匹配到要打包的模块,所以它会自动创建一个上下文语句,这个上下文的起点就时你当前 require所处的 JS文件,然后根据你指定的目录与要匹配的模块类型(扩展名)来生成一个正则表达式,然后在根据这个正则匹配

将指定目录下的所有符合匹配条件的模块都打包进来。

由此我们可以说明 webpack可以通过require进行动态模块加载,但是会将指定匹配目录下的所有符合条件的模块都打包进来。

另外上下文语句还包含了一个将模块加载翻译成对应模块id的字典。以上例为例的话,它就类似于:

’./img/webpack.jpg‘ : 42,
'./img/nodejs.jpg':43,
'./img/express.jpg' :44

当然,你也可以手动创建一个上下文语句,通过手动创建上下文,你可以自定义一个模块打包范围。

首先,通过 require.context 来创建上下文,它接受三个参数,分别是“指定要打包的目录”,“是否搜寻子目录”,“匹配的正则”。

同样的,上下文的起点就是当前的JS文件。

var context = require.context('../img',false,/^.*\.jpg/);

console.log(context.keys()); //拿到匹配的到模块Map表。
console.log(context('./webpack.jpg'));//拿到最终打包好的模块。

总结:不论是自动创建上下文语句还是手动创建上下文语句,上下文语句本身就有不容忽视的作用,因为它可以在 webpack打包的默认流程中加入你自己额外定制的流程。

webpack - require 概要的更多相关文章

  1. [AngularJS + Webpack] require directives

    direictives/index.js: module.exports = function(ngModule) { //register all the directives here requi ...

  2. webpack ------require,ensure

    require-ensure和require-amd的区别: require-amd 说明: 同AMD规范的require函数,使用时传递一个模块数组和回调函数,模块都被下载下来且都被执行后才执行回调 ...

  3. vue项目优化之按需加载组件-使用webpack require.ensure

    require-ensure和require-amd的区别: require-amd 说明: 同AMD规范的require函数,使用时传递一个模块数组和回调函数,模块都被下载下来且都被执行后才执行回调 ...

  4. vue按需加载组件-webpack require.ensure

    使用 vue-cli构建的项目,在 默认情况下 ,执行 npm run build 会将所有的js代码打包为一个整体, 打包位置是 dist/static/js/app.[contenthash].j ...

  5. 关于webpack require.context() 的那点事

    先说 webpack里面有这么一招:使用require.context()方法来自动导入模块 官方文档有点深奥,老衲百度下拿了一段来直接使用,但是想看下它是如何运行的 本篇这里不会有太深入的研究,只是 ...

  6. webpack: require.ensure与require AMD的区别

    http://blog.csdn.net/zhbhun/article/details/46826129

  7. webpack require.ensure 按需加载

    使用 vue-cli构建的项目,在 默认情况下 ,会将所有的js代码打包为一个整体比如index.js.当使用存在多个路由代码的时候,index.js可能会超大,影响加载速度. 这个每个路由页面除了i ...

  8. dva webpack 利用require.context加载多个model

    dva redux数据管理都在models,根据业务不同models可能会有几十甚至上百的 [模块.js], 每次在index.js使用 app.model(require('./models/exa ...

  9. [转] Webpack 入门指迷

    大概算是一份教程吧, 只不过效果肯定不如视频演示之类的好.. Webpack 最近在英文社区上经常看到, 留了心, 但进一步了解是通过下边的视频:视频: How Instagram.com Works ...

随机推荐

  1. 支付宝app支付流程

  2. linux系统中查看己设置iptables规则

    1.iptables -L 查看filter表的iptables规则,包括所有的链.filter表包含INPUT.OUTPUT.FORWARD三个规则链. 说明:-L是--list的简写,作用是列出规 ...

  3. 1.springboot:入门程序

    一.Spring Boot 简介 官网英文: Spring Boot makes it easy to create stand-alone, production-grade Spring base ...

  4. Nginx GZIP 压缩

    [ HTTP 开启gzip ] gzip on; // 开启 nginx在线实时压缩数据流: gzip_min_length 1k; // 允许压缩的页面最小字节 gzip_buffers 32k; ...

  5. Ball CodeForces - 12D (线段树)

    题目链接:https://cn.vjudge.net/problem/CodeForces-12D 题目大意:给你一个人的三个信息,如果存在一个人比当前人的这三个信息都大,那么这个人就会退出,问你最终 ...

  6. 上传程序Dictionary 字典 哈希--多读一写锁ReaderWriterLock

    //上传程序Dictionary 字典 哈希 /// <summary> /// 车辆控制信息哈斯表,Key是终端号,Value是车辆信息控制对象 /// </summary> ...

  7. host-only

    https://www.cnblogs.com/yaox/p/6635312.html

  8. Latex 公式居中

    这么简单的功能要是还要加工具包,LaTeX也不用混了~ 公式用\[...\]来写可以达到公式居中效果. 或者在equation环境外加center环境: \begin{center} \begin{e ...

  9. C++11 多线程编程

    http://blog.csdn.net/column/details/ccia.html?&page=1

  10. Linux组管理和权限管理

    ⒈Linux组基本介绍 1)在Linux中的每个用户必须属于一个组,不能独立于组外. 2)Linux中每个文件都有所有者.所在组.其它组的概念 ①所有者 一般(默认)为文件的创建者,谁创建了该文件,就 ...