webpack 支持的模块方法
在webpack中支持的模块语法风格有:ES6,commonJS和AMD
ES6风格(推荐)
在webpack2中,webpack支持ES6模块语法。这意味着在没有babel等工具处理的情况下你就可以使用import和export。下面的方法在webpack中被支持:
import
静态地导入其他模块的导出
import MyModule from './my-module.js';
import { NamedExport } from './other-module.js';
注:import只能静态的导入其他模板。不能在其他逻辑或者包含变量中动态使用
export
导出变量,函数
import()
import('path/to/module') -> promise
import()在运行期间动态的加载模块,它在内部依赖promise。import()的调用被视为一个分割点,这意味着请求的模块以及它的子模块被分隔到单个的包中。
if(module.hot) {
import('loadsh').then(_ => {
// Do something with lodash (a.k.a '_')...
})
}
import()的注释
行内注释让import()更加地强大。添加注释到import()中,使我们能够对模块进行命名以及选择不同的模式。下面有一些列子:
// single target
import(
/* webpackChunkName: "my-chunk-name" */
/* webpackMode: "lazy" */
'module'
)
// Multiple possible targets
import(
/* webpackInclude: /\.json$/ */
/* webpackExclude: /\.noimport\.json$/ */
/* webpackChunkName: "my-chunk-name" */
/* webpackMode: "lazy" */
/* webpackPrefetch: true */
/* webpackPreload: true */
`./locale/${language}`
) import(
/* webpackIgnore: true */
'ignored-module.js'
)
行内注释可设置的属性
- webpackIgnore: 如果将webpackIgnore被设置为true,将不能动态导入
- webpackChunkName:给包命名。从2.6.0起,占位符[index]和[request]在给定的字符串中被支持,[index]为递增的数字,[request]为实际解析的文件名。在注释中添加webpackChunkName:'my-chunk-name',这会使分隔的包名为 [my-chunk-name].js而不是[id].js
- webpackPrefetch:告诉浏览器,这个资源在将来可能会被需要用于一些导航。
- webpackPreload:告诉浏览器,这个资源在当前导航中可能会需要。
- webpackMode:从2.6.0起,能够指定不同的动态导入模式。可选项如下:
- 'lazy'(default):为每一个import()的模块生成一个懒加载chunk。
- 'lazy-once':只生成一个满足所有import()调用的懒加载chunk。在第一次调用import()时就会去获取chunk,在之后调用import()会使用相同的网络响应。注意这只在部分动态语句中才有意义,例如:import(`./locales/${language}.json`),这儿可能有多个模块路径被请求。
- 'eager':不生成额外的chunk,所有的模块被包含中当前的chunk中并且不会增加额外的网络请求。只要被解析,promise依然会返回。与静态导入不同的是,直到调用import(),module才会被执行
- 'weak':如果模块功能已经在其他地方被加载了(如:在其他模块中导入了它或者加载了包含这个模块的脚本),就尝试去加载这个模块。promise依然会返回,但是只有当chunk已经在客户端了才会resolve,如果模块不可用就会reject。不会发送网络请求。
- 'webpackInclude':在导入期间这个正则表达式会用于匹配,只有被匹配到的模块才会被打包。
- 'webpackExclude':在导入期间这个正则表达式会用于匹配,只要是被匹配到的模块就不会被打包。
commonJS
commonJS的目标是为浏览器之外的JavaScript指定一个生态系统。下面的commonJS方法在webpack中被支持:
require
require(dependency: String);
从其他的模块中同步检索exports。编辑器会确认在输出包中依赖是可用的
var $ = require('jquery');
var myModule = require('my-module');
require.resolve
var ID = require.resolve(dependency: String);
同步检索模块ID,编辑器会确认在输出包中依赖是可用的
require.cache
对同一个模块的多次require,只有一个模块执行并且只有一次导出。这是因为在运行期间存在cache。从cache中移除值这会导致新的模块执行以及新的导出。
var d1 = require('dependency');
require('dependency') === d1;
delete require.cache[require.resolve('dependency')];
require('dependency') !== d1;
// in file.js
require.cache[module.id] === module;
require('./file.js') === module.exports;
delete require.cache[module.id];
require.cache[module.id] === undefined;
require('./file.js') !== module.exports; // in theory; in praxis this causes a stack overflow
require.cache[module.id] !== module;
require.ensure
require.ensure(
dependencies: String[],
callback: function(require),
errorCallback: function(error),
chunkName: String
)
分隔指定的依赖到单独的包中,并且包会被异步加载。使用commonJs语法这是唯一一种动态加载包的方式。这意味着,该代码可以在执行中运行,只有在满足某些条件时才加载依赖项。这个功能在内部依赖promise
if ( module.hot ) {
require.ensure(['b'], function(require) {
var c = require('c');
// Do something special...
});
require.ensure支持如下参数:
- dependencies:字符串数组。声明在callback要执行的所有模块。
- callback:一个函数。当所有的依赖加载完成就会这些这个回调函数。require会作为这个函数的参数,在函数中可以使用require去引入其他的依赖。
- errorCallback:如果依赖加载失败就会执行这个函数
- chunkName:给通过require.ensure()创建的包名指定一个名字
AMD
AMD是一个JavaScript规范,它为书写模块,加载模板定义了接口。在webpack中支持如下的AMD方法
define (with factory)
define([name: String], [dependencies: String[]], factoryMethod: function(...))
如果提供了dependencies,factoryMethod会带着每个dependency输出(按dependencies的相同顺序)被调用,如果dependencies没有被提供,factoryMethod会带着require, exports 和 module被调用,如果这个函数有返回值,这个值会作为模块的输出。webpack会忽略name
define(['jquery', 'my-module'], function($, myModule) {
// Do something with $ and myModule...
// Export a function
return function doSomething() {
// ...
};
});
它不能在异步函数中使用
define (with value)
define(value: !Function)
define({
answer: 42
});
简单的导出value,这儿的value可以是除函数之外的任何值
require (amd-version)
require(dependencies: String[], [callback: function(...)])
它与require.ensure()类似。它会分隔dependencies到一个独立中包中,并且这个包会被异步加载
require(['b'], function(b) {
var c = require('c');
});
webpack
除了上面描述的模块语法之外,webpack还提供了一些webpack特有的方法
require.context
require.context(
directory: String,
includeSubdirs: Boolean /* optional, default true */,
filter: RegExp /* optional, default /^\.\/.*$/, any file */,
mode: String /* optional, 'sync' | 'eager' | 'weak' | 'lazy' | 'lazy-once', default 'sync' */
)
require.include
require.include(dependency: String)
在不执行依赖项的情况下包含依赖项.在优化性能时非常有用
require.include('a');
require.ensure(['a', 'b'], function(require) { /* ... */ });
require.ensure(['a', 'c'], function(require) { /* ... */ });
这会生成如下输出:
- 入口chunk:file.js 和 a
- 异步chunk:b
- 异步chunk:c
如果没有使用require.include('a')。a会被复制在两个anonymous chunk中
webpack 支持的模块方法的更多相关文章
- destoon模块自定义字段的添加并让其支持搜索的方法
今天看了看模块设置里的自定义字段功能的用法,试着加了个新字段glry,设置了值,然后去数据库moduleid的article表看,字段成功加上了. 于是去template下article文件夹的lis ...
- webpack学习之——模块(Modules)
在模块化编程中,开发者将程序分解成离散功能块(discrete chunks of functionality),并称之为模块. 每个模块具有比完整程序更小的接触面,使得校验.调试.测试轻而易举. 精 ...
- Webpack - CommonJs & AMD 模块打包器
Webpack 是一个 CommonJs & AMD 模块打包器.可以把你的 JavaScript 代码分离为多个包,在需要的时候进行加载,支持预处理文件,例如 json, jade, cof ...
- webpack学习之—— 模块热替换(Hot Module Replacement)
模块热替换(HMR - Hot Module Replacement)功能会在应用程序运行过程中替换.添加或删除模块,而无需重新加载整个页面.主要是通过以下几种方式,来显著加快开发速度: 保留在完全重 ...
- 服务器配置ssl证书支持苹果ATS方法
服务器配置ssl证书支持苹果ATS方法 发布日期:2016-12-14 苹果安全工程&架构部门主管Ivan Kristic表示ATS将在今年底成为App Sotre app的必要条件,这将大幅 ...
- C#中扩展StringBuilder支持链式方法
本篇体验扩展StringBuilder使之支持链式方法. 这里有一个根据键值集合生成select元素的方法. private static string BuilderSelectBox(IDicti ...
- APM飞控修改数传模块方法
APM飞控修改数传模块方法 硬件 ARDUCOPTER第二代 数传模块(USB接口) 数传模块(telem接口) usb-ttl模块 修改方法 注意:APM固件版本和数传模块估计版本是分开的,但有一定 ...
- max-height,min-height在IE下不支持的解决方法
max-height,min-height在IE下不支持的解决方法 max-width:160px; max-height:160px; _width:expression(this.width &g ...
- 4种检测是否支持HTML5的方法,你知道几个?
4种检测是否支持HTML5的方法,你知道几个? 1,检查特定的属性是否存在于全局的对象里面,比如说window或navigator. 比如geolocation,它是HTML5新加支持的新特性:它是由 ...
随机推荐
- 十个强大的DevOps基础设施自动化工具,不容错过
Devops基础设施自动化的工具 有许多工具用于基础设施自动化.使用哪个工具决定于体系结构和基础设施的需求.下面我们列出了一些伟大的工具,用于不同类别配置管理.编制.持续集成.监控等. 1.Chef ...
- ping 命令 指定特定网卡 发送 ICMP 数据包
Windows : ping -S Linux : ping -I <device> -I interface interface is either an address, or an ...
- Android高级_视频播放控件
一.Android系统自带VideoView控件 1. 创建步骤: (1)自带视频文件放入res/raw文件夹下: (2)声明初始化VideoView控件: (3)创建视频文件Uri路径,Uri调用p ...
- 用JS制作《飞机大作战》游戏_第1讲(素材查找和界面框架搭建)-陈远波
一.查找素材: 二.分析游戏界面框架: 登录界面.游戏界面.暂停游戏界面.玩家死亡后弹出界面:并对应的界面包含什么元素: 三.分别搭建以上四个界面: 1.登录界面与游戏界面框架(隐藏游戏界面,四个界面 ...
- SDN 第二次作业
问题 1.为什么需要SDN?SDN特点? 答:当今网络快速发展,用户的需求也就日益增加,但网络的创新速度却并没有增加,而是比较缓慢.传统网络中的网络设备是硬件.操作系统.网络应用紧耦合的,每个设备厂商 ...
- js字符串String常用方法
1. charAt() 返回指定位置的字符. str.charAt(index) index 为必须参数,类型为number(0到str.length-1之间,否则该方法返回 空串 ...
- Linux-centos安装node、nginx小记
一.安装node 1.进入/usr目录,新建toos目录 cd /usr && mkdir tools && cd tools 2.wget命令下载对应版本的node包 ...
- Swift 并行编程现状和展望 - async/await 和参与者模式
这篇文章不是针对当前版本 Swift 3 的,而是对预计于 2018 年发布的 Swift 5 的一些特性的猜想.如果两年后我还记得这篇文章,可能会回来更新一波.在此之前,请当作一篇对现代语言并行编程 ...
- BZOJ1005:[HNOI2008]明明的烦恼(组合数学,Prufer)
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...
- shiro实战系列(十一)之Caching
Shiro 开发团队明白在许多应用程序中性能是至关重要的.Caching 是从第一天开始第一个建立在 Shiro 中的一流功 能,以确保安全操作保持尽可能的快. 然而,Caching 作为一个概念 ...