问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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...

importrequire区别 import和export区别 vuerequireimport require import import export importmodule require的用法 npm webpack gulp webpack
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...有人知道我的W7系统,怎么样才能设置屏幕保护时间,想调 长一点因为有... 胸口发凉是什么原因 产后后背发凉怎么回事 后背发凉该怎么调理 背心发凉是什么原因引起的 我想开创业板 咋办 乔迁之喜四句吉言祝福语 乔迁四句顺口溜 乔迁贺词四字顺口溜 ps如何保存为不同格式的图片? PS图片格式是1920*108 webpack rules与loaders有什么区别 《深入浅出Webpack》epub下载在线阅读全文,求百度... 如何开发一个 Webpack Loader 如果我只是想修改已经存在于基础配置中的某个 load... 怎样自己写webpack loader react webpack 的样式相关的 loader,以下两种有什... new webpack.LoaderOptionsPlugin是干什么用的 webpack对样式的处理 导入样式require和import的区别 乌克兰为何针对俄罗斯呢?是有何目的呢? 乌克兰为何要与俄罗斯分手,投入西欧的怀抱? 俄罗斯和乌克兰同为斯拉夫民族,却水火不容,这是... 现代中国名人故事大全 影响中国历史的100位名人 古今历史上出现了许多有才能的人,中国有哪些名人... 中国古代自强不息的名人故事有哪些? 中国历史名人故事? 中国古代名人小故事(100字左右) 中国历史名人故事 葛优的年龄? 葛优为什么没有孩子? webpack css-loader配置中的sourceMap是什么意思 如何使用WORD文档把单词按ABC顺序排列 word高手请进,如何对word文档中的多个单词进行排序 WORD如何进行英文排序 word里面怎样把同样字母的单词都排列在一起 怎样用WORD把单词排列整齐呢? 如何使用word将杂乱的单词象字典里一样按字母顺序... 如何使Word里面的单词按字母排? WORD如何按开头字母排列单词 word怎样将单词按ABC开头排列 请问在word中,如何将这些单词分成4个一行,按顺序... word文档中的单词是乱序的 我想像字典一样按照A-Z... 50分钻石多少钱?现在50分钻戒的价格贵不贵? 50分钻戒一般多少钱?50分钻戒有多大? 50分钻戒价格一般多少钱 请问五十分的钻戒现在多少钱? 50分钻石多少钱 50分男钻戒大概多少钱 有没有人知道50分钻戒大概需要多少钱? 50分钻戒一般多少钱