很多时候我们使用别人的库,都是通过 npm install,再简单的引入,就可以使用了。

 
 
1
2
import React from 'react'
import { connect } from 'react-redux'

那如果我们自己写的组件库和工具 utils 类怎么办?如果你不熟悉别名的概念,通常会引入相对路径,它会变成这样。

 
 
1
2
3
import { someConstant } from './../../config/constants'
import MyComponent from './../../../components/MyComponent'
import { digitUppercase } from './../../../utils'

如果是频繁的引用使用,这样的引用方式的确不是很优雅。接下来就告诉你通过别名的方式可以使用绝对路径去引用本地自己写的组件和工具类。

 
 
1
2
3
4
5
import React from 'react'
import { connect } from 'react-redux'
import { someConstant } from 'config/constants'
import MyComponent from 'components/MyComponent'
import { digitUppercase } from 'utils'

我们需要在 Webpack, Jest, Babel 和 VSCode 对应的配置脚本中声明即可。

对于这篇文章,假设一个应用程序结构如下:

 
 
1
2
3
4
5
6
7
8
9
MyApp/
  dist/
  src/
    config/
    components/
    utils/
  jsconfig.json
  package.json
  webpack.config.js

Webpack 配置

不使用任何额外的插件,Webpack 允许通过配置中的 resolve.alias 属性导入别名模块。

 
 
1
2
3
4
5
6
7
module.resolve = {
  alias: {
    config: path.resolve(__dirname, "..", "src", "config"),
    components: path.resolve(__dirname, "..", "src", "components"),
    utils: path.resolve(__dirname, "..", "src", "utils"),
  }
}

副作用:当 Webpack 知道如何处理这些别名时,VSCode 却不会,像 Intellisense 这样的工具将无法工作。

VS Code 配置

配置 jsconfig.json

首先你要在项目中创建一个 jsconfig.json(建议放在项目的根目录中)。

你可以自己新建一个 json 文件修改文件名为 jsconfig.json。或者如果你全局安装了 typescript,那么在项目根目录执行 tsc --init 即可生成一个 tsconfig.json 然后修改为 jsconfig.json即可。根据文档上说 jsconfig.json 是默认开启了 "allowJs": truetsconfig.json,所以直接用 tsc --init 生成一个,这样所有配置都会带有注释说明。

更多详细配置请看 官网文档 jsconfig.json

最后记得重启下 VS Code 使其生效。

通过告诉 VS Code 如何理解这些别名可以让它变得“更聪明”,就像在 jsconfig.json 文件中使用 exclude 属性,可以在搜索的时候排除 node_modules 或编译的文件夹(如 dist)来加快 VS Code 的全局搜索速度。

 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  "compilerOptions": {
    "target": "ES6",
    "jsx": "react",
    "experimentalDecorators": true,
    "baseUrl": ".",
    "paths": {
      "components/*": ["src/components/*"],
      "config/*": ["src/config/*"],
      "utils/*": ["src/utils/*"]
    }
  },
  "exclude": ["node_modules, "dist""]
}
 

智能路径提示

需要安装插件Path Intellisense,并且进行配置(项目或者全局的settings.json):

 
 
1
2
3
4
5
"path-intellisense.mappings": {
    "config": "${workspaceRoot}/src/config",
    "component": "${workspaceRoot}/src/component",
    "utils": "${workspaceRoot}/src/utils"
  }

使用路径的就可以智能提醒路径,按住 ⌘command就可以跳转到对应代码了。

Babel 配置

babel-plugin-module-resolver 是一个 Babel 模块解析插件,在 babelrc 中可以配置模块的导入搜索路径为模块添加一个新的解析器。这个插件允许你添加新的 “根” 目录,这些目录包含你的模块。它还允许您设置一个自定义别名目录,具体的文件,甚至其他 NPM 模块。

如果你要安装它,根据以下步骤就可以了:

 
 
1
npm install --save-dev babel-plugin-module-resolver

安装完成以后,我们在项目的根目录下,新建一个 .babelrc 配置文件:

 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const path = require('path');
 
module.exports = {
  plugins: [
    [
      'module-resolver',
      {
        alias: {
          components: path.join(__dirname, './src/components'),
        },
      },
    ],
    [
      'import',
      {
        libraryName: 'antd',
        style: true, // or 'css'
      },
    ],
  ],
};

Webpack, VSCode 和 Babel 组件模块导入别名的更多相关文章

  1. python成长之路【第十八篇】:python模块介绍、模块导入和重载

    一.模块和命名空间 一般来说,Python程序往往由多个模块文件构成,通过import语句连接在一起.每个模块文件是一个独立完备的变量包,即一个命名空间.一个模块文件不能看到其他文件定义的变量名,除非 ...

  2. python模块导入细节

    python模块导入细节 官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码文件按照功能可以分为两种类型: ...

  3. 【转】python模块导入细节

    [转]python模块导入细节 python模块导入细节 官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码 ...

  4. Angular问题04 模块导入错误???、BrowserModule模块重复加载???、material模块引入后报错

    1 模块导入错误 1.1 问题描述 项目启动时报错:元数据错误,错误截图如下: 1.2 问题原因 利用VsCode开发angular项目时利用自动导入出现错误 坑01:VsCode 的自动导入功能比较 ...

  5. python之模块导入和包

    一.何为模块 1.一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2.模块目的和函数,对象等一样,是为了代码的复用性而存在的.即一个py程序写了很多功能,也可 ...

  6. 记录一下webpack好用的node模块

    postcss-loader autoprefixer: 自动添加css前缀 css-loader: 能在js文件中导入css(配合React比较好,我猜) style-loader: 将所有的计算后 ...

  7. Go项目结构和模块导入

    Go项目结构和模块导入 golang项目结构与其他语言类似,但是仍然有一些需要注意的地方. 项目结构 环境配置 go 命令依赖一个重要的环境变量:$GOPATH,它表示GO项目的路径,如下设置 exp ...

  8. python 模块导入

    1. 模块导入: 要使用一个模块,我们必须首先导入该模块.Python使用import语句导入一个模块.例如,导入系统自带的模块 math: import math 你可以认为math就是一个指向已导 ...

  9. isinstance和issubclass、动态模块导入、异常处理

    一.isinstance和issubclass isinstance:判断某个对象是否是某个类的实例,返回True或Flase issubclass:判断某个类是否是某个类的子类. 例如: class ...

随机推荐

  1. Nginx修改access.log日志时间格式

    一.修改原因 因为要获取nginx访问信息,作为开发的数据使用,但是nginx的access.log文件中的默认的时间格式是这样的: [02/Nov/2017:20:48:25 +0800] 而要求的 ...

  2. 分布式监控系统开发【day37】:监控数据如何优化(六)

    一.数据如何存储方案讨论 1.一个服务存所有主机 2.一台主机的所有服务 3.所有的服务一分钟存一次? 数据量大,浏览器会卡住, 4.最终方案如下 二.解决方案存在问题 1.只能存7天如何处理? 超过 ...

  3. 远程调试openstack

    之前一直没有找到方法调试openstack的horizon代码,现在终于找到方法了,特别感谢下面这篇博客,讲解非常清晰: http://blog.csdn.net/tantexian/article/ ...

  4. 转:数据标准化/归一化normalization

    转自:数据标准化/归一化normalization 这里主要讲连续型特征归一化的常用方法.离散参考[数据预处理:独热编码(One-Hot Encoding)]. 基础知识参考: [均值.方差与协方差矩 ...

  5. Python print "hello world" SyntaxError: invalid syntax

    刚安装Python,在IDLE中输入print “Hello World”,谁知却发生错误: >>> print "Hello World"SyntaxError ...

  6. MongoDB - MongoDB CRUD Operations, Query Documents, Iterate a Cursor in the mongo Shell

    The db.collection.find() method returns a cursor. To access the documents, you need to iterate the c ...

  7. 【CodeForces】679 A. Bear and Prime 100

    [题目]A. Bear and Prime 100 [题意]有一数字x,每次可询问一个数字y是否x的因子,最后输出数字x是否素数,要求询问次数<=20. [题解]容易发现[2,100]范围内的非 ...

  8. 使用 pjax 载入的新页面,新页面上 类方法 无法被触发?

    在父页面上有定义类似 $(".class").click(function(){ ... }) 经过pjax 载入后的新页面 点击后没有触发事件 在segmentfault 上提问 ...

  9. bootstrap-select,selectpicker 用法详细:通过官方文档翻译

    用过selectpicker的都说好~但是网上中文的教程又找不到比较完整的用法,于是去官网看了下 顺便弄过来翻译一下: 选项可以通过数据属性或JavaScript传递.对于数据属性,附加选项名称dat ...

  10. Redis笔记之常用命令

    keys keys用来获取符合指定规则的键,keys的语法规则如下: keys <pattern> 比如最简单的全等匹配,下面这个命令只会匹配键值完全等于foo的: 127.0.0.1:6 ...