Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CRNA (create-react-native-app) module resolve & eslint rules check #32

Open
lanlin opened this issue Feb 12, 2018 · 6 comments
Open

CRNA (create-react-native-app) module resolve & eslint rules check #32

lanlin opened this issue Feb 12, 2018 · 6 comments

Comments

@lanlin
Copy link
Owner

lanlin commented Feb 12, 2018

环境

expo: 25.0.0
react: 16.2.0
react-natice: 0.52.0

注意本文只针对 create-react-native-app 初始化的项目。
** #其他情况下,本文可能只能用作参考。**

场景

react-native 目前官方默认采用与 Expo 相结合的形式来构建项目。
但是关于 module resolve 这一块,一直没有找到详细的文档说明。
网上千奇百怪的文章一大堆,解决方式也是五花八门。

主要在于项目稍微复杂点的情况下,没人希望用相对路径的形式去引入其他文件。
如下面的例子,相对路径很难看出到底是从哪个目录引入的某个文件。
相比较而言,依托于项目root 目录的绝对路径就简单明了的多。

import foo from '../../../../foo.js';     // relative path
import foo from '~src/components/foo';    // absolute path

解决办法

在既保证绝对路径的引入方式的同时,还加入 eslint 进行规范性检测。

首先,用 create-react-native-app 初始化项目。

安装以下几个 package
package.json

  "devDependencies": {
    "babel": "^6.23.0",
    "babel-plugin-module-resolver": "^3.0.0",
    "eslint": "^4.16.0",
    "eslint-config-airbnb-base": "^12.1.0",
    "eslint-import-resolver-babel-module": "^4.0.0",
    "eslint-plugin-import": "^2.8.0",
    "eslint-plugin-react": "^7.6.1",
    "eslint-plugin-react-native": "^3.2.1"
}

配置 .babelrc

{
  "presets": ["babel-preset-expo"],
  "env": {
    "development": {
      "plugins": ["transform-react-jsx-source"]
    }
  },
  "plugins": [
    ["module-resolver", {
      "alias": {
        "~src": "./src",               // src别名映射,根据需要自行调整
        "~test": "./test"              // test别名映射,根据需要自行调整
      },
      "extensions": [".js", ".ios.js", ".android.js"]
    }]
  ]
}

配置 .eslintrc.js

module.exports = {
  root: true,
  env: { 'react-native/react-native': true },
  extends: ['airbnb-base', 'plugin:react/recommended', 'plugin:react-native/all'],

  plugins: [
    'react',
    'react-native'
  ],

  // check if imports actually resolve
  settings: {
    'import/resolver': {
      'babel-module': {
        alias: {
          '~src': './src',       // 必须与babelrc配置对应
          '~test': './test'      // 必须与babelrc配置对应
        },
        extensions: ['.js', '.ios.js', '.android.js']
      }
    }
  },

  ecmaFeatures: { jsx: true },

  // add your custom rules here
  rules: {
 }
}

题后

以上配置,包含了省略 .js 后缀名的效果。

import foo from 'src/components/foo';

最后记得用 --reset-cache 来运行

yarn run start --reset-cache   // for yarn
npm run start --reset-cache    // for npm
@lanlin
Copy link
Owner Author

lanlin commented Mar 12, 2018

当从 CRNA detach 之后,.babelrc 有所变化

具体如下:

{
  "presets": [
    "babel-preset-react-native-stage-0/decorator-support"
  ],
  "plugins": [
    "transform-react-jsx-source",
    [
      "module-resolver",
      {
        "root": ["./"],
        "alias": {
          "src": "./src",
          "test": "./test"
        },
        "extensions": [
          ".js",
          ".ios.js",
          ".android.js"
        ]
      }
    ]
  ]
}

.eslintrc.js 的配置保持原来的不变。

注意

.babelrc 里面 detach 之后,可能会保留 env 的情况,那是惹祸的根源。
经常导致 resolve 失败,必须把里面的 transform-react-jsx-source 直接放到外面的 plugins 里面来。
就像上面的配置一样。

@meyer-net
Copy link

expo 貌似现在都还没增加对wechat的快速集成吧。

@lanlin
Copy link
Owner Author

lanlin commented Mar 29, 2018

@meyer-net expo 感觉就是个试验品,用来引导入门的。但是对于真实项目,感觉没什么卵用。我完全放弃那个东西了,还是需要 detach。不要很多东西都没有。比如 expo 官网好像自己都说不支持蓝牙什么的。

@meyer-net
Copy link

我也感觉如此,国内的奇葩需求多。要接入各种包,expo不灵活的话,很多事就不好做了。不过他也带来了很多便捷性。小程序原理类似。。。

你们目前对rn的需求如何?现有从业人员转,还是社招。

@hendrul
Copy link

hendrul commented May 14, 2018

Maybe this is the solution, but I don't understand a bit :)

@yesitsfebreeze
Copy link

me neither :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants