webpack中require和import的区别
发布网友
发布时间:2022-04-21 23:58
我来回答
共1个回答
热心网友
时间:2022-04-22 12:07
commonjs同步语法
经典的commonjs同步语法如下:
var a = require('./a');
a.show();
此时webpack会将a.js打包进引用它的文件中。这是最普遍的情形,不必赘述。
commonjs异步加载
在commonjs中有一个Moles/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中require和import的区别
3)(require.ensure() API的第三个参数是给这个模块命名,否则 chunkFilename: "[name].min.js" 中的[name] 是一个自动分配的、可读性很差的id。4)按照上述修改才可以单纯的指定代码分块的输出目录而又不影响其它资源的打包目录。
webpack的require和import 有什么区别
3)(require.ensure() API的第三个参数是给这个模块命名,否则 chunkFilename: "[name].min.js" 中的[name] 是一个自动分配的、可读性很差的id。4)按照上述修改才可以单纯的指定代码分块的输出目录而又不影响其它资源的打包目录。
webpack中require和import的区别
首先无论require还是import,都不是webpack的发明,它们是已经存在于世的不同的模块化规范(目前都不能直接运行于浏览器)。于是需要通过webpack在配合各种plugin、loader将其转义,使之可以运行在浏览器里。关于require,最早应该见于nodejs开发,属于CommonJS规范的一部分,可以看Modules/1.1 关于import,是...
webpack中require和import的区别
require.include是webpack自己提供的,并没有什么规范做后台,所以是个小角色。它可以实现上面是预加载功能,而不用把模块写在数组中,用法如下:require.ensure([], function(require){ require.include('./list');//此处只加载不执行 });据webpack官网文档介绍,require.include还有一个作用是能把子...
require表示什么意思
require和import的区别 遵循的模块化规范不一样 模块化规范:即为 JavaScript 提供一种模块编写、模块依赖和模块运行的方案。谁让最初的 JavaScript 是那么的裸奔呢——全局变量就是它的模块化规范。require/exports 出生在野生规范当中,什么叫做野生规范?即这些规范是 JavaScript 社区中的开发者自己草拟的...
webpack对样式的处理 导入样式require和import的区别
其实我们是不推荐使用@import的,心细的童鞋可以看到最后生成的样式文件有样式是重复的。所以一般我们应该是在js中使用require来引入样式文件。可以参考的说法这里样式压缩压缩代码我们可以使用webpack的内置插件UglifyJsPlugin来做,它既可以压缩js代码也可以压缩css代码。plugins: [ ... new webpack.optimize.UglifyJs...
require和import用法与区别详解
原生浏览器不支持require/exports,可使用支持CommonJS模块规范的Browsersify、webpack等打包工具,它们会将require/exports转换成能在浏览器使用的代码。 import/export在浏览器中无法直接使用,我们需要在引入模块的元素上添加type="module"属性。 即使Node.js13.2+可以通过修改文件后缀为.mjs来支持ES6模块import/export,但是...
webpack对样式的处理 导入样式require和import的区别
我们可以在js中引入样式文件 require('myStyle.css') 这时我们便需要引入相应的webpack loader来帮助我们解析这段代码。 一般来说需要引入css-loader和style-loader,其中css-loader用于解析,而style-loader则将解析后的样式嵌入js代码
require的用法5种
三、webpack自带的require.include。它可以实现上面是预加载功能,而不用把模块写在数组中;require.include还有一个作用是能把子模块中的公共部分,提取到父模块中。四、AMD异步加载。webpack既支持commonjs规范也支持AMD规范,这就意味着AMD的经典语法是可以正常使用的'。五、ES6 import。import会被转化为...
webpack打包原理(webpack打包原理浅浅析前端打包工具)
本质上,webpack基于node平台,利用node的各种api来实现javascript应用程序的一个静态模块的打包工具。在打包过程中,构建依赖关系,并且实现模块引用预处理,以及缓存等。2、分析 1、人口文件 //mian.js consta=require('./m1')constb=require('./m2')import{test}from'./m1'console.log(test)//m...