切换到 Preact 时我的 React 库中的 JSX 出错
Error with JSX in my React Library when Switching to Preact
我有一个非常简单的 React 库,用于我自己的状态管理。它只是一个高阶组件:
import React from 'react';
/**
*
* @param {Object} state - Reference to SubState instance
* @param {Object} chunk - object of props you want maps to from state to props
*/
const connect = (state, chunk)=> Comp => props =>{
const newProps = {};
for (let key in chunk){
newProps[key] = state.getProp(chunk[key]);
}
return (<Comp {...newProps} {...props} />)
};
export {
connect
}
我可以通过这种方式发布库,但我会收到无法在 JSX 中解析 <
的语法错误。
所以我运行代码通过babel
//.babelrc
{
"presets": ["@babel/preset-env","@babel/preset-react"]
}
使用这个 webpack 配置
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname),
filename: 'index.js',
library: 'substateConnect',
libraryTarget: 'umd'
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: ["babel-loader"]
}
]
},
}
这是我的 package.json
的依赖和发布部分
"devDependencies": {
"@babel/core": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"babel-core": "^6.26.3",
"babel-loader": "^8.0.2",
"babel-preset-env": "^1.7.0",
"babel-preset-react": "^6.24.1",
"react": "^16.5.0",
"react-dom": "^16.5.0"
},
"files": [
"index.js",
"index.map",
"src/index.js"
],
"dependencies": {
"@babel/preset-react": "^7.0.0",
"substate": "^4.0.0",
"webpack": "^4.17.2",
"webpack-cli": "^3.1.0"
}
我在每个网站上使用 preact-compat
,但仍然得到 <undefined></undefined>
https://github.com/developit/preact-compat#usage-with-webpack
目前,运行通过 babel 输出在库中做出反应,我的库和 Preact 将任何使用该库的 HOC 标记为 <undefined></undefined>
如果我发布了非 babel 的代码,它只是顶部用新 ECMAScript 编写的源代码,我会在 JSX 的 <
上收到 unable to parse
错误。
但是,如果我不是通过 node_modules
而是在开发人员制作的 myLibrary.js
之类的文件中引用库并使用 un-babel 代码,它就可以工作。
如何正确管理我的依赖项? React 应该是一个 peerDependecy 吗?
此外,如何让这个库在 React 和 Preact 的 node_modules
目录中工作?
感谢@Dominic 帮助我清理我的依赖项。
所以基本上新的依赖项看起来像这样:
"devDependencies": {
"@babel/core": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"@babel/preset-react": "^7.0.0",
"babel-loader": "^8.0.2",
"react": "^16.5.0",
"react-dom": "^16.5.0",
"webpack": "^4.17.2",
"webpack-cli": "^3.1.0"
},
"dependencies": {
"substate": "^4.0.0",
}
重要提示:我不需要 React 作为依赖项。 webpack 和 babel 的任何使用都严格用于开发目的和测试。
实际的最终产品从编译的 index.js
文件转换为简单的:
import React from 'react';
/**
*
* @param {Object} state - Reference to SubState instance
* @param {Object} chunk - object of props you want maps to from state to props
*/
const connect = (state, chunk)=> Comp => props =>{
const newProps = {};
for (let key in chunk){
newProps[key] = state.getProp(chunk[key]);
}
return (<Comp {...newProps} {...props} />)
};
export {
connect
}
假设(我认为这是一个安全和公平的假设)是任何使用它的人都将根据需要进行编译,并 alias
preact 到他们现有的 React 项目中。
这个假设允许我从实际库中删除任何缩小、webpack 或任何实际编译。本质上,只需将此文件用作普通的高阶组件,React 将使用打包器完成剩下的工作,并且根据文档将 React 替换为 Preact 将根据需要工作。
谢谢大家。
我认为你的 webpack
文件中没有 resolve
。
能否请您尝试使用 resolve
配置。
{
// ...
resolve: {
alias: {
'react': 'preact-compat',
'react-dom': 'preact-compat',
// Not necessary unless you consume a module using `createClass`
'create-react-class': 'preact-compat/lib/create-react-class',
// Not necessary unless you consume a module requiring `react-dom-factories`
'react-dom-factories': 'preact-compat/lib/react-dom-factories'
}
}
// ...
}
我有一个非常简单的 React 库,用于我自己的状态管理。它只是一个高阶组件:
import React from 'react';
/**
*
* @param {Object} state - Reference to SubState instance
* @param {Object} chunk - object of props you want maps to from state to props
*/
const connect = (state, chunk)=> Comp => props =>{
const newProps = {};
for (let key in chunk){
newProps[key] = state.getProp(chunk[key]);
}
return (<Comp {...newProps} {...props} />)
};
export {
connect
}
我可以通过这种方式发布库,但我会收到无法在 JSX 中解析 <
的语法错误。
所以我运行代码通过babel
//.babelrc
{
"presets": ["@babel/preset-env","@babel/preset-react"]
}
使用这个 webpack 配置
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname),
filename: 'index.js',
library: 'substateConnect',
libraryTarget: 'umd'
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: ["babel-loader"]
}
]
},
}
这是我的 package.json
"devDependencies": {
"@babel/core": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"babel-core": "^6.26.3",
"babel-loader": "^8.0.2",
"babel-preset-env": "^1.7.0",
"babel-preset-react": "^6.24.1",
"react": "^16.5.0",
"react-dom": "^16.5.0"
},
"files": [
"index.js",
"index.map",
"src/index.js"
],
"dependencies": {
"@babel/preset-react": "^7.0.0",
"substate": "^4.0.0",
"webpack": "^4.17.2",
"webpack-cli": "^3.1.0"
}
我在每个网站上使用 preact-compat
,但仍然得到 <undefined></undefined>
https://github.com/developit/preact-compat#usage-with-webpack
目前,运行通过 babel 输出在库中做出反应,我的库和 Preact 将任何使用该库的 HOC 标记为 <undefined></undefined>
如果我发布了非 babel 的代码,它只是顶部用新 ECMAScript 编写的源代码,我会在 JSX 的 <
上收到 unable to parse
错误。
但是,如果我不是通过 node_modules
而是在开发人员制作的 myLibrary.js
之类的文件中引用库并使用 un-babel 代码,它就可以工作。
如何正确管理我的依赖项? React 应该是一个 peerDependecy 吗?
此外,如何让这个库在 React 和 Preact 的 node_modules
目录中工作?
感谢@Dominic 帮助我清理我的依赖项。
所以基本上新的依赖项看起来像这样:
"devDependencies": {
"@babel/core": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"@babel/preset-react": "^7.0.0",
"babel-loader": "^8.0.2",
"react": "^16.5.0",
"react-dom": "^16.5.0",
"webpack": "^4.17.2",
"webpack-cli": "^3.1.0"
},
"dependencies": {
"substate": "^4.0.0",
}
重要提示:我不需要 React 作为依赖项。 webpack 和 babel 的任何使用都严格用于开发目的和测试。
实际的最终产品从编译的 index.js
文件转换为简单的:
import React from 'react';
/**
*
* @param {Object} state - Reference to SubState instance
* @param {Object} chunk - object of props you want maps to from state to props
*/
const connect = (state, chunk)=> Comp => props =>{
const newProps = {};
for (let key in chunk){
newProps[key] = state.getProp(chunk[key]);
}
return (<Comp {...newProps} {...props} />)
};
export {
connect
}
假设(我认为这是一个安全和公平的假设)是任何使用它的人都将根据需要进行编译,并 alias
preact 到他们现有的 React 项目中。
这个假设允许我从实际库中删除任何缩小、webpack 或任何实际编译。本质上,只需将此文件用作普通的高阶组件,React 将使用打包器完成剩下的工作,并且根据文档将 React 替换为 Preact 将根据需要工作。
谢谢大家。
我认为你的 webpack
文件中没有 resolve
。
能否请您尝试使用 resolve
配置。
{
// ...
resolve: {
alias: {
'react': 'preact-compat',
'react-dom': 'preact-compat',
// Not necessary unless you consume a module using `createClass`
'create-react-class': 'preact-compat/lib/create-react-class',
// Not necessary unless you consume a module requiring `react-dom-factories`
'react-dom-factories': 'preact-compat/lib/react-dom-factories'
}
}
// ...
}