摘要:的匹配问题初现在中,通过设置属性可以配置查找模块的基路径,也可以设置搜索的模块后缀名,当然,最后一个就是我们要讲的别名设置。深入源码之先贴上部分源码这段简单的代码所做的就是针对别名做映射,获取到对应的模块。修改非常简单,进行严格相等的判断
@(webpack)
webpack是一款功能强大的前端构建工具,不仅仅是针对js,它也可通过各种loader来构建相关的less,html,image等各种资源,将webpack配合流程制定工具gulp结合起来,则更为方便的自定义工作流程。
[TOC]
webpack的alias匹配问题初现在webpack.config.js中,通过设置resolve属性可以配置查找“commonJS/AMD模块”的基路径,也可以设置搜索的模块后缀名,当然,最后一个就是我们要讲的别名alias设置。
跟踪问题在模块开发过程中,我们可能会对可以复用的组件封装成一个可被git管控的模块,并在引用的过程中采用带版本号的方式引用,这就要求我们在webpack.config.js中添加相关alias配置,如
... module.exports = { entry: { main: "index.js" }, output: { path: "build" filename: "[name].js" }, resolve: { root: "modules" alias: { "mod/slider": "/path/mods/mod/slider/0.0.5", "mod/footer": "/path/mods/mod/footer/0.0.2", "mod/slider/0.0.3": "/path/mods/mod/slider/0.0.3", "mod/header": "/path/mods/mod/header/0.0.1", "mod/slider/0.0.1": "/path/mods/mod/slider/0.0.1" } } }
有一个简单的需求,即在index.js中,可这样引用:
var slider = require("mod/slider"); var sliderV3 = require("mod/slider/0.0.3"); var sliderV1 = require("mod/slider/0.0.1");
结果和我们预想的会有不同,webpack的别名处理逻辑会使这三个变量的引用都为 slider这个变量所对应的模块,要想解决这种情况,只能深入源码。
深入源码之ModuleAliasPlugin先贴上部分源码:
var aliasMap = this.aliasMap; resolver.plugin("module", function(request, callback) { var fs = this.fileSystem; var keys = Object.keys(aliasMap); var i = 0; (function next() { for(;i < keys.length; i++) { var aliasName = keys[i]; var onlyModule = /$$/.test(aliasName); if(onlyModule) aliasName = aliasName.substr(0, aliasName.length-1); if((!onlyModule && request.request.indexOf(aliasName + "/") === 0) || request.request === aliasName) { var aliasValue = aliasMap[keys[i]]; if(request.request.indexOf(aliasValue + "/") !== 0 && request.request != aliasValue) { var newRequestStr = aliasValue + request.request.substr(aliasName.length); var newRequest = this.parse(newRequestStr); var obj = { path: request.path, request: newRequest.path, query: newRequest.query, directory: newRequest.directory }; var newCallback = createInnerCallback(callback, callback, "aliased with mapping " + JSON.stringify(aliasName) + ": " + JSON.stringify(aliasValue) + " to " + newRequestStr); if(newRequest.module) return this.doResolve("module", obj, newCallback); if(newRequest.directory) return this.doResolve("directory", obj, newCallback); return this.doResolve(["file", "directory"], obj, newCallback); } } } return callback(); }.call(this));
这段简单的代码所做的就是针对别名做映射,获取到对应的模块。
之所以出现上节的问题,就是因为这句判断
if(request.request.indexOf(aliasValue + "/") !== 0 && request.request != aliasValue)
webpack的作者貌似有些多此一举了,或者说是在我们的应用场景中并没有考虑到,所以仅仅针对这个判断进行修改就可以满足需求。修改非常简单,进行严格相等的判断:
if(request.request != aliasValue)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/78457.html
webpack 是什么 showImg(https://segmentfault.com/img/bVzLhA?w=2598&h=1299); 一项技术、一个工具的出现,肯定是为了解决问题的。那么,webpack 是为了解决什么问题?答案是:文件依赖管理。浏览器端的 Js, 出于安全的考虑,对本地文件没有操作权限,不能引用其它 js, css 等文件。而 webpack 就是用来解决这个问题的,让...
摘要:运行该语句会执行如下步骤使用进行文件压缩。设置环境变量,触发某些包,以不同的方式进行编译。在原始的源码中执行查找和替换操作。等同于表示任何出现的地方都会被替换为。提供函数用来合并配置对象当文件小于限制,会返回。 选项 1.devtool:通过在浏览器调试工具(browser devtools)中添加元信息(meta info)增强调试。 2.resolve.alias:创建 impor...
摘要:调用全局的守卫。在被激活的组件里调用。用创建好的实例调用守卫中传给的回调函数。 本文适用于对 Vue.js 和 vue-router 有一定程度了解的开发者除特殊说明,vue-router 版本为 3.0.2 正文 路由 class 匹配 路由匹配后会给该标签添加 class 属性值 .router-link-active,该功能在嵌套路由中十分方便 class 的实际属性值可以通...
阅读 1760·2021-11-22 09:34
阅读 1104·2021-10-09 09:44
阅读 2942·2021-09-29 09:35
阅读 3584·2021-09-14 18:01
阅读 1428·2021-08-16 10:49
阅读 1064·2019-08-29 14:11
阅读 770·2019-08-29 12:47
阅读 3040·2019-08-26 13:47