webpack - require 概要
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 概要的更多相关文章
- [AngularJS + Webpack] require directives
direictives/index.js: module.exports = function(ngModule) { //register all the directives here requi ...
- webpack ------require,ensure
require-ensure和require-amd的区别: require-amd 说明: 同AMD规范的require函数,使用时传递一个模块数组和回调函数,模块都被下载下来且都被执行后才执行回调 ...
- vue项目优化之按需加载组件-使用webpack require.ensure
require-ensure和require-amd的区别: require-amd 说明: 同AMD规范的require函数,使用时传递一个模块数组和回调函数,模块都被下载下来且都被执行后才执行回调 ...
- vue按需加载组件-webpack require.ensure
使用 vue-cli构建的项目,在 默认情况下 ,执行 npm run build 会将所有的js代码打包为一个整体, 打包位置是 dist/static/js/app.[contenthash].j ...
- 关于webpack require.context() 的那点事
先说 webpack里面有这么一招:使用require.context()方法来自动导入模块 官方文档有点深奥,老衲百度下拿了一段来直接使用,但是想看下它是如何运行的 本篇这里不会有太深入的研究,只是 ...
- webpack: require.ensure与require AMD的区别
http://blog.csdn.net/zhbhun/article/details/46826129
- webpack require.ensure 按需加载
使用 vue-cli构建的项目,在 默认情况下 ,会将所有的js代码打包为一个整体比如index.js.当使用存在多个路由代码的时候,index.js可能会超大,影响加载速度. 这个每个路由页面除了i ...
- dva webpack 利用require.context加载多个model
dva redux数据管理都在models,根据业务不同models可能会有几十甚至上百的 [模块.js], 每次在index.js使用 app.model(require('./models/exa ...
- [转] Webpack 入门指迷
大概算是一份教程吧, 只不过效果肯定不如视频演示之类的好.. Webpack 最近在英文社区上经常看到, 留了心, 但进一步了解是通过下边的视频:视频: How Instagram.com Works ...
随机推荐
- JVM调优命令-jinfo
jinfo JVM Configuration info这个命令作用是实时查看和调整虚拟机运行参数. 之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinf ...
- DBA记录-数据库管理员需要掌握的内容
1.Linux 2.ORACLE/MySQL/SQLSERVER 3.NOSQL 4.环境部署.用户及权限管理.表空间.表.视图.索引.过程.触发器.分区.函数.查询.性能调优.迁移备份.集群.日志分 ...
- html5 实时监听输入框值变化的完美方案:oninput & onpropertychange
结合 HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件来监听输入框值变化. H5手机端: <input type="text" ...
- mysql 案例 ~ pt-archiver 归档工具的使用
一 简介:今天咱们来聊聊pt-archiver的使用 二 相关参数 相关参数1 --statistics 结束的时候给出统计信息:开始的时间点,结束的时间点,查询的行数,归档的行数,删除的行数,以 ...
- 【转】利用URLConnection来发送POST和GET请求
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...
- Kali2.0第一节
kali2.0很好的做了工具缩减,以及图形处理,重要的是msf更快了!汉化也远远超过了1.0 如果想要汉化,选择设置里面的Region&language 将language选择设置为中文,注 ...
- MYSQL和oracle 大小写问题
MySQL的大小写问题 不是一个很大的问题,但是如果不了解的话,却会使用户产生迷惑 :如下面 Sql代码insert into t values('A'); insert into t values( ...
- ubuntu14.04 下安装 gsl 科学计算库
GSL(GNU Scientific Library)作为三大科学计算库之一,除了涵盖基本的线性代数,微分方程,积分,随机数,组合数,方程求根,多项式求根,排序等,还有模拟退火,快速傅里叶变换,小波, ...
- ROS 错误之 [rospack] Error: package 'beginner_tutorials' not found
ubuntu 下面情况处理 $ cd $gedit .bashrc 再后面加入两行 source /opt/ros/indigo/setup.bash source /home/lv/catkin_w ...
- jmeter中实现java请求实战日志
view code public class JdbcInsert implements JavaSamplerClient { // 全局变量 PreparedStatement pstmt; Co ...