webpack配置别名alias出现的错误匹配
@(webpack)
webpack是一款功能强大的前端构建工具,不仅仅是针对js,它也可通过各种loader来构建相关的less,html,image等各种资源,将webpack配合流程制定工具gulp结合起来,则更为方便的自定义工作流程。
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)
webpack配置别名alias出现的错误匹配的更多相关文章
- webpack配置别名alias
在webpack.config.js中,通过设置resolve属性可以配置查找“commonJS/AMD模块”的基路径,也可以设置搜索的模块后缀名,还可以设置别名alias.设置别名可以让后续引用的地 ...
- webpack 配置别名,解决 import 时路径查找麻烦的问题
在编写代码时,使用 import 导入别的文件,可能会遇到查找路径麻烦的问题 比如这里的 ../../ 还要去思考多少个 ../ 那么可以在 webpack 中,将 src 目录设置一个别名,方便文件 ...
- webpack 使用别名(resolve.alias)解决scss @import相对路径导致的问题
webpack.conf.js 中 resolve.alias 配置 resolve: { extensions: ['.js', '.vue'], alias: { '@': path.resolv ...
- webpack中 resolve.alias 配置,@import相关踩坑
1.在使用webpack打包项目时,可以在配置文件中配置resolve.alias来定义一些绝对路径,方便在项目中灵活使用路径,举例如下: resolve: { extensions: [‘.js‘, ...
- Nginx 核心配置-根目录root指令与别名alias指令实战案例
Nginx 核心配置-根目录root指令与别名alias指令实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.试验环境说明 1>.虚拟机环境说明 [root@nod ...
- 别名alias永久生效别名alias永久生效;虚拟机的NAT模式,进行静态IP配置,并A、B的实现免密访问
别名alias永久生效 1.打开cd /etc/profile.d 目录 新建文件my_alias.sh 2.my_alias.sh里面添加 alias p=’poweroff -h’ alias r ...
- vue-cli webpack配置 简单分析
vue-cli webpack配置分析 入口 从package.json可以看到开发和生产环境的入口. "scripts": { "dev": "no ...
- vue-cli 中的 webpack 配置详解
本篇文章主要介绍了 vue-cli 2.8.2 中的 webpack 配置详解, 做个学习笔记 版本 vue-cli 2.8.1 (终端通过 vue -V 可查看) vue 2.2.2 webpack ...
- vue-cli中的webpack配置
编辑模式下显示正常,打开的时候不知道为啥排版有问题.segementfalut链接在这里 版本号 vue-cli 2.8.1 (终端通过vue -V 可查看) vue 2.2.2 webpack 2. ...
随机推荐
- .Net Core MVC 网站开发(Ninesky) 2.4、添加栏目与异步方法
在2.3中完成依赖注入后,这次主要实现栏目的添加功能.按照前面思路栏目有三种类型,常规栏目即可以添加子栏目也可以选择是否添加内容,内容又可以分文章或其他类型,所以还要添加一个模块功能.这次主要实现栏目 ...
- 前端CSS预处理器Sass
前面的话 "CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工 ...
- 【原】nodejs全局安装和本地安装的区别
来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...
- ABP文档 - 导航
文档目录 本节内容: 创建菜单 注册导航供应器 显示菜单 每个web应用都有一些菜单用来在页面/屏幕之间导航,ABP提供了一个通用的基础框架创建并显示菜单给用户. 创建菜单 一个应用可能由不同模块组成 ...
- Unity3D框架插件uFrame实践记录(一)
1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...
- Spring注解
AccountController .java Java代码 1. /** 2. * 2010-1-23 3. */ 4. packag ...
- RabbitMQ + PHP (二)AMQP拓展安装
上篇说到了 RabbitMQ 的安装. 这次要在讲案例之前,需要安装PHP的AMQP扩展.不然可能会报以下两个错误. 1.Fatal error: Class 'AMQPConnection' not ...
- ES6(块级作用域)
我们都知道在javascript里是没有块级作用域的,而ES6添加了块级作用域,块级作用域能带来什么好处呢?为什么会添加这个功能呢?那就得了解ES5没有块级作用域时出现了哪些问题. ES5在没有块级作 ...
- BPM助力企业数字化转型
自九十年代末,流程管理开始引入国内,至今已经有20多年的历史了,由最初的部门级应用向企业级应用转变,大家的认知也经历了一系列的发展变化.不同阶段的信息化水平对企业的流程以及BPM平台也提出了不同的需求 ...
- CRM 数据密钥 忘记 解决方案
UPDATE EmailServerProfile SET IncomingPassword=nullUPDATE EmailServerProfile SET OutgoingPassword=nu ...