痛点

如果我们有这个目录:

  1. ├── webpack.config.js
  2. ├── src
  3. ├── view
  4. ├── index.js
  5. │── router
  6. ├── index.js

不使用任何方式的路径别名的话,在/view/index.js内要引入/router/index.js的话,就要使用../router。当目录结构变深的时候就会出现../../../../../,这是一个噩梦。

所以我们的目标是用@view指代/src/view目录,@router指代/src/router目录,

@src指代/src目录。@alias只是形式上表示这是一个别名,@并不是必需的,可以用$,%,^,甚至不使用,直接src指代/src

在JavaScript中的解决方案

构建工具的alias

在构建工具Webpack中可以使用 resolve.alias 属性定义。

  1. resolve:{
  2. alias: {
  3. '@view': path.resolve(__dirname, 'src/view'),
  4. '@router': path.resolve(__dirname, 'src/router')
  5. }
  6. }

这时在/view/index.js中就可以使用@router[/index.js]来引入/router/index.js了。

使用Webpack的alias属性推荐(必需)使用绝对路径,因为Webpack采用的使用时匹配替换形式的。就是说如果alias.@router 设为 ../router 的话,在使用2router引入的时候会被替换成../router,虽然在/view/index.js中能正常工作,但是在/view/user/index.js中就找不到文件了。所以坚决建议使用绝对路径。

重写require

重写require方法,如:sexy-require,在require的时候用自定义的路径替换,这个一般会在Node.js中使用。下面是一个简单实现:

  1. const alias = {
  2. '@view' : path.resolve(__dirname, 'src/view'),
  3. '@router': path.resolve(__dirname, 'src/router')
  4. }
  5. const _require = Module.prototype.require;
  6. Module.prototype.require = function(path) {
  7. for (let ali in alias) {
  8. path = path.replace(ali, alias[ali]);
  9. }
  10. return _require.call(this, path)
  11. }

当然这种方法只能用在require方式引入文件,ES Module是用不了的。

在TypeScript中的解决方案

在TypeScript中需要在编译前配置路径映射的baseUrl和paths,用于告诉编译器到哪里去查找模块。但是编译过程中并不会将路径替换成目标路径,就是.ts文件中的@router在生成的.js文件中仍然是@router。这就要我们编译后的文件再设置一次路径别名了。如果用Webpack打包的当然可以使用构建工具的alias完成别名。如果没有用Webpack的也可以重写require方法,这里记得要将tsconfig.json里面"module"设为"commonjs",因为我们只能重写require方法。

注意:如果.ts文件存放在src目录,编译后.js文件存放在dist目录,记得.ts文件中的路径映射是要用以src目录为基础的,而对.js文件得路径别名要以dist目录为基础

  1. // tsconfig.json
  2. // baseUrl 是源代码目录
  3. {
  4. "compilerOptions": {
  5. "target": "ES2017",
  6. "module": "commonjs",
  7. "outDir": "dist",
  8. "baseUrl": "src",
  9. "paths": {
  10. "$*": ["*"]
  11. }
  12. },
  13. "include": ["src/**/*"],
  14. "exclude": ["dist"]
  15. }
  1. // package.json
  2. // path.$* 的路径都是以tsconfig.json 中 outDir 为基础的
  3. {
  4. "name": "alias",
  5. "version": "1.0.0",
  6. "description": "",
  7. "main": "index.js",
  8. "scripts": {
  9. "start": "node ./dist/router"
  10. },
  11. "author": "",
  12. "license": "ISC",
  13. "devDependencies": {
  14. "@types/node": "^8.0.47",
  15. "sexy-require": "^0.1.0"
  16. },
  17. "path": {
  18. "$router": "/dist/router",
  19. "$view": "/dist/view"
  20. }
  21. }
  1. // src/router/index.ts
  2. require("sexy-require");
  3. const view = require("$view");
  4. console.log(view);
  5. export = "router/index";
  1. // src/view/index.ts
  2. export = "view/index";

../../../../.. 太low了的更多相关文章

  1. 女朋友看了我的博客,说太LOW了,于是我搞了一天~

    持续原创输出,点击上方蓝字关注我 原创博客+1,点击左下角阅读原文进入 目录 前言 如何下载? 配置文件的分类 基本信息配置 修改主题 Next主题样式设置 添加动态背景 修改链接的样式 添加文章搜索 ...

  2. 前端嫌弃原生Swagger界面太low,于是我给她开通了超级VIP

    缘由 接口文档想必是许多开发小伙伴的噩梦,不仅要写详细,还要及时维护文档与后端代码保持一致,稍有没及时更新接口文档,前端同学肯定会抱怨后端同学给的文档与实际情况不一致. 于是,引入了Swagger组件 ...

  3. java太low,又舍不得jvm平台的丰富资源?试试kotlin吧(一)

    尝试kotlin的起因 因为各种原因(版权,人员招聘),公司的技术体系从c#转到了java,我花了大概两周的时间来上手java,发现java的语法还是非常简单的,基本看着代码就知道什么意思.学习jav ...

  4. 程序员还在用360,腾讯电脑管家清理注册表,清理垃圾?只能说你太low

    首先明明电脑上,就有清理垃圾和无用注册表的功能,只是我么缺少发现美的眼睛. 为什么不用360,腾讯全家桶. 那玩意固然香,而且真香,但是后台占用率太高,作为一个有洁癖的我,实在是不想看到自己右下角多一 ...

  5. 你别告诉我你还在用Excel做数据透视分析吧,太low了!

    来到大数据分析的时代,大量的大数据分析软件涌现,尽管如此,如果今天有人问起最常用的数据透视分析工具是什么的时候,我猜想Excel应该是大家的不二之选. 但是其实我想说,用现在的手机来打比方,Excel ...

  6. 还在用逆向工程?太Low了,试试通用Mapper吧!

    什么是通用Mapper? 通用mapper 可以极大的方便开发人员进行ORM,提供极其方便的单表增删改查. 什么是通用mapper,一句话简单说,它就是个辅助mybatis极简单表开发的组件.它不是为 ...

  7. 【图文并茂】 做开发这么久了,还不会搭建服务器Maven私有仓库?这也太Low了吧

    大家好,我是冰河~~ 最近不少小伙伴想在自己公司的内网搭建一套Maven私服环境,可自己搭建的过程中,或多过少的总会出现一些问题,问我可不可以出一篇如何搭建Maven私服的文章.这不,就有了这篇文章嘛 ...

  8. 别再用 System.currentTimeMillis 统计耗时了,太 Low,试试 Spring Boot 源码在用的 StopWatch吧,够优雅!

    大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 @SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源 ...

  9. ASP.NET Core 之 Identity 入门(二)

    前言 在 上篇文章 中讲了关于 Identity 需要了解的单词以及相对应的几个知识点,并且知道了Identity处在整个登入流程中的位置,本篇主要是在 .NET 整个认证系统中比较重要的一个环节,就 ...

随机推荐

  1. Ruby Rose动态壁纸制作记录

    为Wallpaper Engine做的动态壁纸,使用Unity制作,在这里记录一下制作过程和一些遇到的坑,以后有了github账号再搬到那边去. 最后大概要做出这样的效果,截图来自RWBY " ...

  2. php显示距当前多长时间

    <?php header("Content-type: text/html; charset=utf-8");date_default_timezone_set('PRC') ...

  3. ACM学习之路___HDU 2066 一个人的旅行

    Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还 ...

  4. 解决外部编辑器修改Eclipse文件延迟刷新【补充】

    在之前的文章,使用gulp解决外部编辑器修改Eclipse文件延迟刷新,原理是用gulp把更改过的项目文件直接复制一份到Tomcat的webapp.root下, 现在补充另外一种方法,双击Server ...

  5. GCD XOR uvalive6657

    GCD XORGiven an integer N, nd how many pairs (A; B) are there such that: gcd(A; B) = A xor B where1 ...

  6. Finding LCM (最小公倍数)

    Finding LCM Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu [Submit]   ...

  7. java中集合的增删改操作及遍历总结

      集合的增删改操作及遍历总结

  8. IE兼容

    这个基本知识http://www.cnblogs.com/yoosou/archive/2012/07/27/2612443.html 参考: http://www.cnblogs.com/cocow ...

  9. java课程作业--动手动脑

    随机数: 1)编写一个方法,使用以下算法生成指定数目(比如1000个)的随机整数. Modulus=231-1=int.MaxValue Multiplier=75=16807 C=0 当显示过231 ...

  10. Oracle之 any 、some、all解析

    oracle之 any.some.all 解析 因为很少用到, 所以几乎忘记了这几个函数, 不过它们还是很有用的使用它们可以大大简化一些SQL文的语法, 至于效率问题, 如CCW所说它们和EXISTS ...