打字稿根据编译命令包含不同的文件
Typescript including different files depending on compilation command
我使用 creat-react-app
来初始化一些我想在本机和 Web 之间共享的代码。在我的 package.json
中,我有两个单独的命令,用于使用 react-scripts-ts
和 react-native-scripts-ts
:
为每个平台启动
package.json
...,
"scripts": {
"tsc": "tsc",
"clean": "rimraf artifacts",
"build": "npm run clean && npm run tsc --",
"start-web": "npm run build && react-scripts-ts start",
"start-native": "npm run build && react-native-scripts start",
},
...
(有关如何执行此操作的详细说明可在此处找到 https://medium.com/@yannickdot/write-once-run-anywhere-with-create-react-native-app-and-react-native-web-ad40db63eed0)
太棒了,我可以在两个平台上使用 react-native
组件。我遇到的问题是当我尝试使用 react-routing
.
等外部包时
我在 package.json
中包含 react-router-native
和 react-router-dom
。我正在尝试实现本文 (https://medium.com/@yannickdot/hi-jared-2650fbb2eda1) 中描述的内容,但使用的是打字稿而不是 JS,给我:
routing.native.tsx
export {
NativeRouter as Router, // Rename
Switch,
Route,
Link
} from 'react-router-native'
routing.web.tsx
export {
BrowserRouter as Router,
Switch,
Route,
Link
} from 'react-router-dom'
然而,与文章中描述的相反,当使用打字稿时,它不会自动识别应该包含哪个文件。我得到一个简单的错误:
src/App.tsx:10:26 - error TS2307: Cannot find module './routing'.
10 import Router from "./routing";
这是有道理的,因为当我查看编译器的输出时,不存在模块 routing
:
artifacts
| App.js
| routing
| routing.native.js
| routing.web.js
如何告诉打字稿编译器在 运行 start-native
命令时包含所有 *.native.tsx
文件,在 运行 start-web
命令?
理想情况下,这应该可以在编译时实现,将附加参数传递给 typescript 编译器,从而覆盖 tsconfig.json
。示例:
tsc --exclude="./**/*.native.tsx"
我知道这可以通过黑客解决方案来完成,例如通过编写一个脚本来复制整个源代码,删除所有不需要的文件,保留正确的文件,并编译复制的源文件夹,但我想知道是否有更简洁的方法来做到这一点。
提前致谢!
不使用外部工具的可能解决方案:
1。创建一个函数来检查平台 运行
见
export default function getPlatform(): string {
if (typeof document != 'undefined') {
// I'm on the web!
return 'web';
}
else if (typeof navigator != 'undefined' && navigator.product == 'ReactNative') {
// I'm in react-native
return 'native';
}
else {
// I'm in node js
return 'node';
}
}
2。创建 routing/index.ts
import getPlatfrom from '../getPlatform';
const platform = getPlatfrom();
const routing = platform === 'web' ? require('./routing.web') : require('./routing.native');
export const {Router, Switch, Route, Link} = routing;
3。使用路由
import { Route } from './routing/index';
您可以在 routing/index
中添加一个接口 IRouting
和一些类型转换,这样您就不会失去类型安全和自动完成功能 ...
我使用 creat-react-app
来初始化一些我想在本机和 Web 之间共享的代码。在我的 package.json
中,我有两个单独的命令,用于使用 react-scripts-ts
和 react-native-scripts-ts
:
package.json
...,
"scripts": {
"tsc": "tsc",
"clean": "rimraf artifacts",
"build": "npm run clean && npm run tsc --",
"start-web": "npm run build && react-scripts-ts start",
"start-native": "npm run build && react-native-scripts start",
},
...
(有关如何执行此操作的详细说明可在此处找到 https://medium.com/@yannickdot/write-once-run-anywhere-with-create-react-native-app-and-react-native-web-ad40db63eed0)
太棒了,我可以在两个平台上使用 react-native
组件。我遇到的问题是当我尝试使用 react-routing
.
我在 package.json
中包含 react-router-native
和 react-router-dom
。我正在尝试实现本文 (https://medium.com/@yannickdot/hi-jared-2650fbb2eda1) 中描述的内容,但使用的是打字稿而不是 JS,给我:
routing.native.tsx
export {
NativeRouter as Router, // Rename
Switch,
Route,
Link
} from 'react-router-native'
routing.web.tsx
export {
BrowserRouter as Router,
Switch,
Route,
Link
} from 'react-router-dom'
然而,与文章中描述的相反,当使用打字稿时,它不会自动识别应该包含哪个文件。我得到一个简单的错误:
src/App.tsx:10:26 - error TS2307: Cannot find module './routing'.
10 import Router from "./routing";
这是有道理的,因为当我查看编译器的输出时,不存在模块 routing
:
artifacts
| App.js
| routing
| routing.native.js
| routing.web.js
如何告诉打字稿编译器在 运行 start-native
命令时包含所有 *.native.tsx
文件,在 运行 start-web
命令?
理想情况下,这应该可以在编译时实现,将附加参数传递给 typescript 编译器,从而覆盖 tsconfig.json
。示例:
tsc --exclude="./**/*.native.tsx"
我知道这可以通过黑客解决方案来完成,例如通过编写一个脚本来复制整个源代码,删除所有不需要的文件,保留正确的文件,并编译复制的源文件夹,但我想知道是否有更简洁的方法来做到这一点。
提前致谢!
不使用外部工具的可能解决方案:
1。创建一个函数来检查平台 运行
见
export default function getPlatform(): string {
if (typeof document != 'undefined') {
// I'm on the web!
return 'web';
}
else if (typeof navigator != 'undefined' && navigator.product == 'ReactNative') {
// I'm in react-native
return 'native';
}
else {
// I'm in node js
return 'node';
}
}
2。创建 routing/index.ts
import getPlatfrom from '../getPlatform';
const platform = getPlatfrom();
const routing = platform === 'web' ? require('./routing.web') : require('./routing.native');
export const {Router, Switch, Route, Link} = routing;
3。使用路由
import { Route } from './routing/index';
您可以在 routing/index
中添加一个接口 IRouting
和一些类型转换,这样您就不会失去类型安全和自动完成功能 ...