标签:oss 注意 简单 filter tip 性能 use 多个 包含
在webpack中支持的模块语法风格有:ES6,commonJS和AMD
在webpack2中,webpack支持ES6模块语法。这意味着在没有babel等工具处理的情况下你就可以使用import和export。下面的方法在webpack中被支持:
静态地导入其他模块的导出
import MyModule from ‘./my-module.js‘;
import { NamedExport } from ‘./other-module.js‘;
注:import只能静态的导入其他模板。不能在其他逻辑或者包含变量中动态使用
导出变量,函数
import(‘path/to/module‘) -> promise
import()在运行期间动态的加载模块,它在内部依赖promise。import()的调用被视为一个分割点,这意味着请求的模块以及它的子模块被分隔到单个的包中。
if(module.hot) { import(‘loadsh‘).then(_ => { // Do something with lodash (a.k.a ‘_‘)... }) }
行内注释让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‘ )
commonJS的目标是为浏览器之外的JavaScript指定一个生态系统。下面的commonJS方法在webpack中被支持:
require(dependency: String);
从其他的模块中同步检索exports。编辑器会确认在输出包中依赖是可用的
var $ = require(‘jquery‘);
var myModule = require(‘my-module‘);
var ID = require.resolve(dependency: String);
同步检索模块ID,编辑器会确认在输出包中依赖是可用的
对同一个模块的多次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( 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支持如下参数:
AMD是一个JavaScript规范,它为书写模块,加载模板定义了接口。在webpack中支持如下的AMD方法
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(value: !Function)
define({ answer: 42 });
简单的导出value,这儿的value可以是除函数之外的任何值
require(dependencies: String[], [callback: function(...)])
它与require.ensure()类似。它会分隔dependencies到一个独立中包中,并且这个包会被异步加载
require([‘b‘], function(b) { var c = require(‘c‘); });
除了上面描述的模块语法之外,webpack还提供了一些webpack特有的方法
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(dependency: String)
在不执行依赖项的情况下包含依赖项.在优化性能时非常有用
require.include(‘a‘); require.ensure([‘a‘, ‘b‘], function(require) { /* ... */ }); require.ensure([‘a‘, ‘c‘], function(require) { /* ... */ });
这会生成如下输出:
如果没有使用require.include(‘a‘)。a会被复制在两个anonymous chunk中
标签:oss 注意 简单 filter tip 性能 use 多个 包含
原文地址:https://www.cnblogs.com/QxQstar/p/10331205.html