【发布时间】:2015-08-19 13:34:51
【问题描述】:
我正在尝试将 jsx 模板名称的字符串传递给一个组件,该组件将负责仅渲染基本的仅 html 组件而无需交互(我们有很多)。
'use strict';
import React from 'react';
export default class TemplateLoader extends React.Component {
displayName = 'TemplateLoader'
constructor(props) {
super(props);
}
render() {
var template = require('./static-templates/'+this.props.template+'.jsx');
return template(this);
}
}
控制台的输出是
./app/components/template-loader/static-templates/xxx.jsx
Module parse failed: /Users/xxx/Sites/xxx/app/components/template-loader/static-templates/c017-top-phones-reasons.jsx Line 1: Unexpected token <
You may need an appropriate loader to handle this file type.
| <div class="xxx">
|
| </div>;
@ ./app/components/template-loader/static-templates ^\.\/.*\.jsx$
如果我切换到
'use strict';
import React from 'react';
import jsx from 'react-jsx';
import fs from 'fs';
export default class TemplateLoader extends React.Component {
displayName = 'TemplateLoader'
constructor(props) {
super(props);
}
render() {
var file = fs.readFileSync('./static-templates/'+this.props.template+'.jsx');
var template = jsx.server(file, 'utf-8');
return template(this);
}
}
我明白了
Error: ENOENT, no such file or directory './static-templates/xxx.jsx'
at Object.fs.openSync (fs.js:438:18)
at Object.fs.readFileSync (fs.js:289:15)
如下所述,我的设置是 web pack,我们使用 gocardless.com 的 Splash Pages 作为基础。我添加了 html-loader、file-loader、css-loader。
我的文件配置有
node: {
fs: "empty"
},
module: {
loaders: [
{ test: /\.html$/, loader: "html-loader" },
{ test: /\.(jpe?g|png|gif|svg|eot|woff|ttf)$/, loader: 'file-loader' },
{ test: /\.js$/, exclude: /node_modules/, loaders: ['react-hot-loader', 'babel-loader'] },
{ test: /\.json$/, exclude: /node_modules/, loader: 'json-loader' },
{ test: /\.scss$/, loader: 'style-loader!css-loader!sass-loader' },
{ test: /\.css$/, loader: 'style-loader!css-loader' },
],
},
【问题讨论】:
-
你能描述一下你的构建系统吗?似乎您使用的 webpack 没有适用于 JSX 的加载器。您用于构建的命令和配置文件会有所帮助。