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 ...
随机推荐
- Oracle记录-开启与关闭数据库
1.配置tnsnames.ora/listener.ora #cd /usr/oracle/oracle/product/11.2.0/db_1/network/admin ---切换到安装目录 #v ...
- 第15月第29天 ffmpeg AVERROR_EOF
1. 在直播时返回AVERROR_EOF代表流结束吗?但对方还在直播,没有结束. int ret = av_read_frame(mContext, pkt); if (ret == AVERROR_ ...
- Vue项目实践中的功能实现与要点
本贴记录项目实践中,各种功能的实现与技术要点,均有待改进. 路由切换的时候,显示loading动画 目前方案是: 在每个页面都手动装载一个loading组件组件的显示依赖vuex里面的一个值 , 在r ...
- Android NetworkInterface 的 name
user@android:/$ ls /sys/class/net/ dummy0 lo p2p0 rev_rmnet0 rev_rmnet1 rev_rmnet2 rev_rmnet3 rmnet0 ...
- oracle查询所有的表明
如果是用该用户登录使用以下语句: SELECT * FROM USER_TABLES; 如果是用其他用户: SELECT * FROM ALL_TABLES WHERE OWNER='USER_NAM ...
- 对HUAWEI-ManagedProvisioning的一次不完整分析
分析思路 关注点1:AndroidManifest.xml是Android应用的入口文件,包含有APP服务的权限.广播和启动位置. 关注点2:涉及到修改系统的函数,setWifiEnabled().I ...
- HTML学习笔记06-连接
HTML超链接 HTML使用标签<a>来设置文本超链接. 超链接可以是文字,也可以是图片,点击这些内容跳转到新的文档或当前文档的某个部分 代码类似这样: <a href=" ...
- Java中利用Scanner键入的字符串与其他字符串的比较
利用Scanner获取到键入的字符串与其他字符串作比较时,如果直接用关系运算符 == 比较,得到的结果总是false,因为实际比较的是两个变量引用的内存地址: 而要比较其内容是否相等,可以使用Obje ...
- elasticsearch5.0集群大数据量迁移方法及注意事项
当es集群的数据量较小的情况下elasticdump这个工具比较方便,但是当数据量达到一定级别比如上百G的时候,elasticdump速度就很慢了,此时我们可以使用快照的方法进行备份 elasticd ...
- CentOS6.5编译安装Nginx1.8.1+MySQL5.5.48+PHP5.2.17+xcache3.2+ZendOptimizer-3.3.9
一.安装Nginx: 1.解决依赖关系 编译安装nginx需要事先需要安装开发包组"Development Tools"和 "Development Libraries& ...