我正在使用ReactJS.NET。我可以让React.Sample.Webpack演示工作,但我想修改它以使用 TypeScript。
@Html.React("Components.Temp", new { })
最终错误是从Index.cshtml
. 这是错误消息:
将“Components.Temp”渲染为“react_3FYDPtcTMkKrddTO7ozOCA”时出错:脚本抛出异常:元素类型无效:需要字符串(对于内置组件)或类/函数(对于复合组件),但得到:对象。
问题
演示项目中使用的 .jsx 文件以以下语句结尾:
module.exports = Avatar; // From Avatar.jsx
module.exports = Comment; // From Comment.jsx
module.exports = CommentsBox; // From CommentsBox.jsx
注意使用module.exports
. tsc 生成的代码改为:
exports.default = Temp; // From Temp.jsx
exports.default = TempImport; // From TempImport.jsx
此外,在 tsc 生成的 .jsx 文件中,导入的组件default
添加了一个属性。从Temp.jsx
下面的文件:
render() {
return (<TempImport_1.default />);
}
注意default
附加到TempImport_1
如果我手动更改 tsc 生成的 .jsx 文件以使用modules.export = Temp
and <TempImport />
,一切正常。
问题
- 如何生成可由 ReactJS.NET Html 帮助程序使用的 .jsx 文件?
- 有这个设置
tsconfig.json
吗? - 有没有我可以添加的加载器来解决
webpack.config.js
这个问题?
编辑
如果我export default
从 .tsx 文件中的类定义中删除并module.exports = ComponentName
在最后手动添加,则生成的 .jsx 文件也有module.exports
。但是,default
仍然添加到所有导入组件的末尾。请参阅本文末尾的“尝试 2”代码。
相关文件
临时导入.tsx
import * as React from "react";
export default class TempImport extends React.Component<undefined, undefined> {
render() {
return (<h1>Temp Import</h1>);
}
}
临时文件
import * as React from "react";
import TempImport from "./TempImport";
export default class Temp extends React.Component<undefined, undefined> {
render() {
return (<TempImport />);
}
}
tsconfig.json
{
"compileOnSave": true,
"compilerOptions": {
"jsx": "preserve",
"module": "commonjs",
"noImplicitAny": true,
"outDir": "./Content/components",
"sourceMap": true,
"target": "es6"
},
"include": [
"./src/**/*"
]
}
TempImport.jsx(由 tsc 生成)
const React = require("react");
class TempImport extends React.Component {
render() {
return (<h1>Temp Import</h1>);
}
}
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = TempImport;
Temp.jsx(由 tsc 生成)
const React = require("react");
const TempImport_1 = require("./TempImport");
class Temp extends React.Component {
render() {
return (<TempImport_1.default />);
}
}
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = Temp;
webpack.config.js
var path = require("path");
module.exports = {
context: path.join(__dirname, "Content"),
entry: {
server: "./server",
client: "./client"
},
output: {
path: path.join(__dirname, "build"),
filename: "[name].bundle.js"
},
module: {
rules: [
{
test: /\.jsx?$/,
loaders: ["babel-loader"],
exclude: /node_modules/
}
]
},
resolve: {
extensions: [".js", ".jsx", ".ts", ".tsx"]
},
externals: {
react: "React"
}
};
Temp.tsx(尝试 2)
注意我已删除export default
并添加module.exports = Temp
import * as React from "react";
import TempImport from "./TempImport";
class Temp extends React.Component<undefined, undefined> {
render() {
return (<TempImport />);
}
}
module.exports = Temp;
Temp.jsx(尝试 2 - 由 tsc 生成)
请注意,它现在module.exports = Temp
位于底部,但<TempImport_1
仍default
附加在其上。
const React = require("react");
const TempImport_1 = require("./TempImport");
class Temp extends React.Component {
render() {
return (<TempImport_1.default />);
}
}
module.exports = Temp;