【发布时间】:2019-06-27 14:51:27
【问题描述】:
我刚刚使用 react native 建立了一个小测试项目。这对我来说是全新的(包括 ECMAScript 6)。 Eslint 告诉我一些关于“循环依赖”的事情,我不知道如何解决这个问题。代码仍然有效。
我的 package.json:
...
"dependencies": {
"axios": "^0.19.0",
"node-sass": "^4.12.0",
"react": "16.8.3",
"react-native": "0.59.9",
"react-navigation": "^3.11.0"
},
"devDependencies": {
"@babel/core": "7.4.5",
"@babel/runtime": "7.4.5",
"babel-eslint": "^10.0.1",
"babel-jest": "24.8.0",
"babel-plugin-module-resolver": "^3.2.0",
"eslint": "^5.16.0",
"eslint-config-airbnb": "^17.1.0",
"eslint-import-resolver-babel-module": "^5.1.0",
"eslint-plugin-import": "^2.17.3",
"eslint-plugin-jsx-a11y": "^6.2.1",
"eslint-plugin-react": "^7.13.0",
"jest": "24.8.0",
"metro-react-native-babel-preset": "0.54.1",
"react-dom": "^16.8.6",
"react-test-renderer": "16.8.3"
},
...
src/index.jsx 是主要的 JSX 文件:
import { Comp1 } from 'components';
...
我创建了一个src/components/index.jsx 来启用类似的导入
import { Comp1, Comp2, Comp3 } from 'components'
而不是
import { Comp1 } from 'components/comp1';
import { Comp2 } from 'components/comp2';
import { Comp3 } from 'components/comp3';
文件src/components/index.jsx 看起来像:
export * from './button';
export * from './comp1';
...
src/components/button/index.jsx:
import React from 'react';
import {
Text,
TouchableOpacity
} from 'react-native';
import style from './style';
const Button = ({ onPress, children }) => {
const {
buttonStyle,
textStyle
} = style;
return (
<TouchableOpacity onPress={onPress} style={buttonStyle}>
<Text style={textStyle}>
{children}
</Text>
</TouchableOpacity>
);
};
export default Button;
export { Button };
src/components/comp1/index.jsx:
import React from 'react';
import {
Text,
View
} from 'react-native';
import { Button } from 'components';
import style from './style';
const Comp1 = (props) => {
const {
textStyle,
viewStyle
} = style;
return (
<View style={viewStyle}>
<Text style={textStyle}>some text</Text>
<Button>Test</Button>
</View>
);
};
export default Comp1;
export { Comp1 };
运行此设置会产生 eslint 错误 import/no-cycle。代码本身有效。
如果我将src/components/comp1/index.jsx 中的import { Button } from 'components' 更改为import { Button } from 'components/button',则会弹出no eslint 错误。
我想使用上面描述的这种简短的导入语法,而不会失去在彼此内部使用模块的可能性。有什么办法吗?
【问题讨论】:
-
这段代码的运行时结构是什么?您是在转译为 CommonJS(例如,
require调用),还是将 ESM(import和export声明)留在浏览器看到的转译结果中? -
尝试使用npmjs.com/package/madge检查此类错误,非常有用。
-
@T.J.Crowder 老实说,我不知道 React Native 项目中是否生成了 CJS 或 ESM。我只知道这里使用 babel 来转译代码。 “Babel [...] 主要用于将 ECMAScript 2015+ 代码转换为向后兼容的 JavaScript 版本”(参见 babeljs.io/docs/en)。
-
@T.J.Crowder Facebook 告诉我JavaScriptCore 用于当前实现ECMAScript 的react 本机应用程序,如ECMA-262 specification。这是否自动意味着我们在这里谈论 ESM?有人知道吗?
-
我知道 JavaScriptCore 支持 ESM,但这并不一定意味着 React Native 正在使用它,尤其是。因为 React Native 早于 JavaScriptCore 对 ESM 的支持。 (抱歉,还没有玩过 React Native。)我希望可以查看实际转译的 .js 文件以了解它们使用的模块语法...
标签: javascript reactjs ecmascript-6