webpack中可以写commonjs格式的require同步语法,可以写AMD格式的require回调语法,还有一个require.ensure,以及webpack自己定义的require.include,再加上ES6的import语法,这么多岂不是会把人给搞乱。本篇就来梳理一下这些require各自的特点,以及都在什么场景下使用。

commonjs同步语法
经典的commonjs同步语法如下:
var a = require('./a');
a.show();
此时webpack会将a.js打包进引用它的文件中。这是最普遍的情形,不必赘述。
commonjs异步加载
在commonjs中有一个Modules/Async/A规范,里面定义了require.ensure语法。webpack实现了它,作用是可以在打包的时候进行代码分片,并异步加载分片后的代码。用法如下:
require.ensure([], function(require){
var list = require('./list');
list.show();
});
此时list.js会被打包成一个单独的chunk文件,大概长这样:
1.fb874860b35831bc96a8.js
可读性比较差。我在上一篇结尾也提到了,给它命名的方式,那就是给require.ensure传递第三个参数,如:
require.ensure([], function(require){
var list = require('./list');
list.show();
}, 'list');
这样就能得到你想要的文件名称:
list.fb874860b35831bc96a8.js
你也可以传入像"question/list"这样带层级的名字,这样webpack会按照层级给你创建文件夹。
需要注意的是,如果你在require.ensure的函数中引用了两个以上的模块,webpack会把它们打包在一起,比如:
require.ensure([], function(require){
var list = require('./list');
list.show();
var edit = require('./edit');
edit.display();
}, 'list_and_edit');
list.js和edit.js将会被打包成一个文件,并命名为list_and_edit.js。这就需要根据你的实际情况来衡量了,如果你不希望打包在一起,只能写两个require.ensure分别引用这两个文件。
多说一句,这种思维其实我是很不喜欢的,在编码阶段却要对打包的事情做出决策,明显违背了职责分离原则。
commonjs预加载懒执行
在上面的用法中,我们给require.ensure的第一个参数传了空数组,实际上这里是可以接收模块名称的,作用就是实现预加载懒执行。用法如下:
require.ensure(['./list'], function(require){
var list = require('./list');
list.show();
});
给require.ensure的第一个参数传了['./list'],执行到这里的时候list.js会被浏览器下载下来,但是并不会执行list.js模块中的代码,也就是webpack官网说的,不会进行evaluate。真正进行evaluate的时候是到了后面这句var list = require('./list');这就是所谓的懒执行。
写在函数中的多个模块会被打包在一起,这一点和上面没有区别。另外,写在数组中的模块也会跟他们打包在一起,不管你有没有手动执行。
这种写法也是有点别扭的,像是commonjs和AMD的结合体,而且一个模块名称还要写两次,真是不够优雅。所以webpack自己定义了一个方法,能够实现预加载。
webpack自带的require.include
require.include是webpack自己提供的,并没有什么规范做后台,所以是个小角色。它可以实现上面是预加载功能,而不用把模块写在数组中,用法如下:
require.ensure([], function(require){
require.include('./list');//此处只加载不执行
});
据webpack官网文档介绍,require.include还有一个作用是能把子模块中的公共部分,提取到父模块中,比如child1和child2都引用了list.js这个模块,那么如果在parent中include了list.js,那么子模块中的就会被删掉,相当于提升到了父模块中。(这里所谓的父子关系是指引用关系)
这个方法官方也是一笔带过,看来也是一个鸡肋的东西,用处不大。因为我发现require.include的返回值是undefined,也就是说,如果你想使用模块,姿势是这样的:
require.ensure([], function(require){
require.include('./preview'); //加载
let p = require('./preview'); //执行
p.getUrl(); //使用
}, 'pre');
AMD异步加载
webpack既支持commonjs规范也支持AMD规范,这就意味着AMD的经典语法是可以正常使用的,如:
require(['./list'], function(list){
list.show();
});
当然,这样写的话list.js也是被单独打包成一个文件的。与上面类似,如果你在这里写了多个模块,那么这些模块都会被打包成一个文件,如:
require(['./list', './edit'], function(list, edit){
list.show();
edit.display();
});
list.js和edit.js会被打包在一起。不同的是,AMD的方式无法传入第三个参数当文件名,所以得不到很好看的文件。
ES6 import
这年头不用ES6都不好意思跟人打招呼。所以我们的代码中,又会多一种模块引入语法,那就是import。import会被转化为commonjs格式或者是AMD格式,所以不要把它认为是一种新的模块引用方式。babel默认会把ES6的模块转化为commonjs规范的,你也不用费劲再把它转成AMD了。
所以如下写法是等价的:
import list from './list';
//等价于
var list = require('./list');
不过这两种写法只需选一种,避免在代码中同时使用两种,否则会造成混淆。
总结
以上把require的用法捋了一遍,明白了各自用法的区别之后,我们就可以在项目中进行选择了。我觉得最佳选择是往commonjs方向靠拢,想尝试ES6的话就用import代替commonjs同步语法即可。
因此,代码中保持以下两种风格就好:
//可打包在一起的同步代码,使用import语法
import list from './list';
//需要独立打包、异步加载的代码,使用require.ensure
require.ensure([], function(require){
var list = require('./list');
});
很显然,你在写代码的时候还是需要对打包结果进行决策,这是我不喜欢webpack的原因。gulp那样多好,编码就是编码,编译就是编译,分开来。不过这就是webpack以模块为核心的打包方式的特点吧,仁者见仁,只要团队内做一个约定,也不会打的一塌糊涂。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# webpack
# require用法
# require
# js
# webpack中引用jquery的简单实现
# webpack常用配置项配置文件介绍
# Webpack+Vue如何导入Jquery和Jquery的第三方插件
# webpack+vue.js快速入门教程
# webpack+vue.js实现组件化详解
# webpack独立打包和缓存处理详解
# vue2.0+webpack环境的构造过程
# webpack2.0搭建前端项目的教程详解
# 加载
# 的是
# 这是
# 写在
# 第一个
# 多个
# 你在
# 两种
# 这就
# 还有一个
# 会把
# 第三个
# 转化为
# 传了
# 官网
# 组中
# 那就是
# 分片
# 我是
# 有什么
相关文章:
如何在阿里云ECS服务器部署织梦CMS网站?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
如何配置支付宝与微信支付功能?
MySQL查询结果复制到新表的方法(更新、插入)
如何获取开源自助建站系统免费下载链接?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
网站制作费用多少钱,一个网站的运营,需要哪些费用?
建站VPS配置与SEO优化指南:关键词排名提升策略
如何配置WinSCP新建站点的密钥验证步骤?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
c# Task.ConfigureAwait(true) 在什么场景下是必须的
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
,想在网上投简历,哪几个网站比较好?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
如何高效搭建专业期货交易平台网站?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
如何彻底删除建站之星生成的Banner?
Python如何创建带属性的XML节点
家庭服务器如何搭建个人网站?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
山东网站制作公司有哪些,山东大源集团官网?
建站之星备案是否影响网站上线时间?
宝塔新建站点为何无法访问?如何排查?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
英语简历制作免费网站推荐,如何将简历翻译成英文?
如何用PHP工具快速搭建高效网站?
如何选择域名并搭建高效网站?
如何在建站主机中优化服务器配置?
如何在建站之星网店版论坛获取技术支持?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
如何通过服务器快速搭建网站?完整步骤解析
网站制作公司排行榜,四大门户网站排名?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
制作公司内部网站有哪些,内网如何建网站?
Python文件管理规范_工程实践说明【指导】
如何高效生成建站之星成品网站源码?
黑客如何通过漏洞一步步攻陷网站服务器?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
如何在云服务器上快速搭建个人网站?
建站主机如何选?性能与价格怎样平衡?
制作企业网站建设方案,怎样建设一个公司网站?
创业网站制作流程,创业网站可靠吗?
山东云建站价格为何差异显著?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。