解决基于TypeScript 的 RN项目相对路径引入组件的问题

一、前言

在开发RN项目时,经常会要使用这样的方式(../../../)来引入组件,感觉非常繁琐,如果项目结构层级比较多,引入的头部更加分不清. 那有没有一种方案和vue项目一样,经过配置后简写路径,在引入的时候,直接使用,例如vue项目中 @ 符号表示 src目录. 经过百度后,发现还是有这种类似的配置. 但尝试过网上的几种方案,都没起作用,主要是由于我的项目是基于 RN(0.59.5) + TypeScript搭建的。

二、尝试过的错误方案

1. 在文件夹中加入 package.json

例如你想引入utils里面的文件,不想../../../..,这样引入,而是想@utils/.....这样引入,那么你就可以在utils文件中放一个package.json,里面如下

  1. {
  2. ?????name:"@utils"
  3. }

该方案,我尝试之后没有成功,项目中的 ts文件有规则校验,会有错误提示,找不到该模块。 如果不是用TypeScript构建的项目,我想是可以的。

2. 安装?babel-plugin-root-import

这种方案,网上搜索是最多的. 网上所描述的具体实现,这里不撰写了,反正我按照网上的步骤配置,没有成功。估计也是只适合于ES6构建的项目。

以上两种方案,参考 react-native 相对项目路径导入组件, 感谢暖暖的风儿 给我提供了些思路

3. 使用@providesModule

在文件的顶部,嵌套一个多行注释,把@providesModule放在注释里,@providesModule后添加类名,以后就直接使用类名就能导入了。

注意,带有@providesModule的多行注释,一定要是文件的第一个多行注释。如:

  1. /**
  2. ?* @providesModule Common
  3. ?*/

  4. import {
  5. ????Dimensions
  6. } from ‘react-native‘;
  7. export default
    class Common {
  8. ????static bgColor = ‘rgb(232,232,232)‘;
  9. ????static screenW = Dimensions.get(‘window‘).width;
  10. ????static screenH = Dimensions.get(‘window‘).height;
  11. }

外部使用Common

  1. // 以前需要这样

  2. // import Common from ‘./../Common/Common‘

  3. ?
    ?
  4. // 现在可以直接用类名

  5. import Common from ‘Common‘

    尝试之后,ts的校验,还是会报错. 这种方案主要是参考ReactNative之解决文件导入路径问题, 这篇文章中有介绍@providesModule的原理,有兴趣的同学,请拜读。

4. 使用typescript path mapping设置相对路径

因为项目是用TypeScript构建的,在尝试几种错误思路后,然后想TypeScript是不是本来就支持路径设置?确实,TypeScript是支持设置相对路径的. 网上提供的方案

在?tsconfig.json?中设置

  1. {
  2. ??"baseUrl": "./",
  3. ??"path": {
  4. ????"@http/*": ["src/http/*"],
  5. ????"@utils/*": ["src/utils/*"]
  6. ??}
  7. }

这样在?import?的时候就不用使用一长串的?../../../..?这种形式了,直接使用相对短路径

  1. import {AuthService} from ‘@http/Auth‘;

    采用这种方案之后,在ts文件中的校验不报错了,也能直接链接到对应的申明。但编译为javascript后,路径并没有映射过去,生成apk的时候报错,提示找不到对应的模块。

    至此,我已发现,只要解决此编译问题,那么就能解决了。但是发现没有这么简单,后又尝试了引入 module-alias, tsmodule-alias等插件来解决此编译问题都没有成功,估计是没有用正确。

三、最终方案

轮番尝试以上的几种错误方案后,反复搞了一天,心累了。哎,还好没有最终放弃,在上述的第2种方案中,我引入了babel-plugin-root-import插件, 发现可以使用某个符号替代路径.

1.安装?babel-plugin-root-import

npm install babel-plugin-root-import --save-dev  或 yarn add babel-plugin-root-import –dev

?
?

如果 npm 没有安装成功,就用 yarn (我是使用yarn 才安装成功)

2.babel.config.js 增加如下配置

  1. module.exports = {
  2. ??plugins: [
  3. ????[
  4. ??????‘babel-plugin-root-import‘,
  5. ??????{
  6. ????????rootPathPrefix: ‘~‘, // `~` 默认

  7. ????????rootPathSuffix: ‘src‘
  8. ??????}
  9. ????]
  10. ??]
  11. }

这里,我尝试过rootPathPrefix 用 @ , 在编译的时候会报错。所以不得不放弃使用@ (有些强迫症,想要用@, 因为vue项目中就是@表示src目录)

3.执行npm start -- --reset-cache命令

已有项目,记得执行此命令清理缓存,这点非常重要,我在调试的过程中,变更过几次符号的配置,如果变更配置后没有执行该命令,则配置不起作用

4. 设置typescript相对路径

在?tsconfig.json?中设置

  1. ?{
  2. ?"baseUrl": "./",
  3. ??"path": {
  4. ????"~/*": ["src /*"],
  5. ??}
  6. }

注意:变更设置之后,最好重启下VSCode

至此,我们在项目中引入文件可以用以下优雅的方式

  1. import { UserAccount } from ‘~/constants/const‘
  2. import MyTheme from ‘~/assets/commonStyle‘

?
?

四、总结

项目是使用 TypeScript + Dva构建的RN项目,该问题网上给出的一些方案都是基于 ES6构建的RN项目,所以之前的解决方案,都不适应。再加上我学习TypeScript 和 RN的时间不长,很多理论知识学习不到位。所以花了比较长的时间。我正在搭建基于TypeScript + Dva + RN + React-Navigation 的App开发框架,欢迎有兴趣的同学一起交流。后续,也会把我搭建的项目框架,进行开源, 目前还只实现了一些基础建设,哈哈~~。

以下是我项目框架的目录:

原文地址:https://www.cnblogs.com/xyb0226/p/10986338.html

时间: 2024-11-07 18:57:32

解决基于TypeScript 的 RN项目相对路径引入组件的问题的相关文章

如何在ASP.NET 5上搭建基于TypeScript的Angular2项目

一.前言 就在上月,公司的一个同事建议当前的前端全面改用AngularJs进行开发,而我们采用的就是ASP.NET 5项目,原本我的计划是采用TypeScript直接进行Angular2开发.所以借用这段时间来写下如何在ASP.NET 5下搭建基于TypeScript的Angualr2的项目,下面我们就进入正题. 二.环境配置 如果读者直接按照Angular.io上的方式搭建是无法通过的,所以下面我们的教程基本跟Angular.io上的类似,只是其中的配置会有所不同,并且也会多出一些步骤. 1.

SVN中基于Maven的Web项目更新到本地过程详解

环境 MyEclipse:10.7 Maven:3.1.1 概述 最近在做项目的时候,MyEclipse下载SVN上面基于Maven的Web项目总是出现很多问题,有时候搞了很半天,Maven项目还是出现叉号,最后总结了方法步骤,终于可以将出现的问题解决,在此,将重现从SVN上将基于Maven的Web项目变成本地MyEclipse中项目的过程,问题也在其中进行解决. 问题补充 在使用Myeclipse的部署Web项目的时候,在点击部署按钮的时候,没有任何反应,在此提供两种解决方法,问题如图1所示:

【react】使用 create-react-app 构建基于TypeScript的React前端架构----上

写在前面 一直在探寻,那优雅的美:一直在探寻,那精湛的技巧:一直在探寻,那简单又直白,优雅而美丽的代码. ------ 但是在JavaScript的动态类型.有时尴尬的自动类型转换,以及 “0 == false” 是true的尴尬, 你知道 “[undefined] == 0“ 是什么返回结果吗?再然后 function add (a, b) { return a+b } add ("1", 2) // 12 这个结果是返回是12. 还记得某个深夜,当你望着万行代码流出千行热泪的时候吗

如何创建一个基于Maven的SmartGWT项目

如何创建一个基于Maven的SmartGWT项目 使用环境 Eclipse的版本为:Luna Service Release 2 (4.4.2)(这个其实不是很重要,你完全可以使用最新版本的Eclipse或者MyEclipse) Maven的版本为:3.1.0 SmartGWT的版本为:6.0p GWT的SDK版本为:2.7 前提准备 你需要安装Maven.如何安装Maven不是文本的内容,你可以参考我的关于Maven的博客. 把SmartGWT的jar包上传到私服服务器. 操作过程 创建GWT

基于SG2D制作的项目资源管理器

假期使用SG2D制作了一个开发辅助工具——“项目资源管理器”支持Windows和MacOSX,下面是其3个主要功能: 1.添加键值对表.支持添加文本,URL和其他类型的键值对.文本键值对兼容Android项目,导入Android项目后便可通过R类常量来获取字符串. 2.生成项目依赖资源文件的索引,指定资源目录和资源搜索起始目录(资源目录必须是资源搜索起始目录的子孙目录)并勾选生成资源索引复选框,便会将资源索引信息保存在资源目录下的resources.xml文件中. 3.同步各平台项目之间依赖的资

【SpringCloud】(1)---基于RestTemplate微服务项目案例

基于RestTemplate微服务项目 在写SpringCloud搭建微服务之前,我想先搭建一个不通过springcloud只通过SpringBoot和Mybatis进行模块之间额通讯.然后在此基础上再添加SpringCloud框架. 下面先对案例做个说明 该项目有一个maven父模块,其中里面有三个子模块:  serverspringcloud:整体父工程.    serverspringcloud-api:公共子模块,放公共实体对象.  serverspringcloud-provider-

如何在Android studio上运行从github上下载的RN项目

想要编译别人的RN项目,还是要踩踩坑才能走上正轨啊,分享下我试过多种方法后最喜欢的方法(其实是因为我多次用VS Code编译都是以失败而告终,所以才选择的studio) 注意:这一步是你的开发环境都安装配置好了,RN项目可以正常创建啦 1,从GitHub上下载一个RN项目,解压到文件夹 2,用Android studio打开项目下的xxx/android文件 (1)打开后,首先打开Terminal敲入命令行:npm install 下载安装所需要的组件 (2)接下来成功后在Terminal命令行

almost最好的Vue + Typescript系列02 项目结构篇

基于vue-cli 3.x,配合typescript的环境构建的新vue项目,跟以前的结构相比,有了一些变化,下面我们来简单的了解一下 基本结构: node_modules: 项目中安装的依赖模块 public: 主页文件index.html && favicon.icon(将以往单独在外部的index.html移到了public文件夹下),index.html我们可以像平时普通的html文件一样引入文件(css,js)和书写基本信息,添加meta标签等. src: 源码文件夹,基本上我们

解决IDEA下运行android项目 No resource found that matches the given name 'Theme.AppCompat.Light'.

1.右击项目选择 解决IDEA下运行android项目 No resource found that matches the given name 'Theme.AppCompat.Light'.