EsBuild StartService 替换
EsBuild StartService replacement
我是 esBuild 和 ReactJS 的新手,根据指导,我决定构建自定义 CLI Transpiling 应用程序。
我到了要在 textarea 中输入文本的地步,但在客户端的控制台上出现了以下错误消息主机版本“0.8.27”与二进制版本“0.9.0”不匹配。我知道我使用的是旧版本,我确实尝试找到一种方法来首先通过文档来解决问题,因为他们已经完全丢弃了新版本上的 startService() 方法。但是我找不到任何可能解决我的问题的方法,是否有人有知识可以帮助我解决问题。
这是我必须开始转译的代码:
const startService = async () => {
ref.current = await esbuild.startService({
worker: true,
wasmURL: '/esbuild.wasm'
})
}
useEffect(() => {
startService()
}, [])
const onClick = async () => {
if (!ref.current) {
return;
}
const result = await ref.current.build({
entryPoints: ['index.js'],
bundle: true,
write: false,
plugins: [unpkgPathPlugin()]
})
console.log(result );
setCode(result)
}
浏览器中 运行 esbuild 的文档在此处:https://esbuild.github.io/api/#running-in-the-browser。在 0.9.0 版本中,esbuild.startService()
变成了 esbuild.initialize()
,service.build()
变成了 esbuild.build()
(即显式服务对象消失了)。所以更新后的代码可能看起来像这样:
const startService = async () => {
await esbuild.initialize({
worker: true,
wasmURL: '/esbuild.wasm'
})
ref.current = true
}
useEffect(() => {
startService()
}, [])
const onClick = async () => {
if (!ref.current) {
return;
}
const result = await esbuild.build({
entryPoints: ['index.js'],
bundle: true,
write: false,
plugins: [unpkgPathPlugin()]
})
console.log(result);
setCode(result)
}
请注意,在浏览器中 运行 时没有可用的异步 API。另外,我不想每次在编辑时热重载时都抛出 'already initialized'。这就是我的设置方式:
import { useState, useEffect } from 'react';
import './App.css';
import * as esbuild from 'esbuild-wasm';
function App() {
const [input, setInput] = useState('');
const [code, setCode] = useState('');
useEffect(() => {
// This ugly code is to avoid calling initialize() more than once
try {
esbuild.build({});
} catch (error) {
if (error instanceof Error && error.message.includes('initialize')) {
esbuild.initialize({
worker: false,
wasmURL: '/esbuild.wasm',
});
} else {
throw error;
}
}
}, []);
const onClick = () => {
esbuild
.transform(input, {
loader: 'jsx',
target: 'es2015',
})
.then((result) => {
setCode(result.code);
});
};
return (
<div className="App">
<textarea
value={input}
onChange={(e) => setInput(e.target.value)}></textarea>
<div>
<button onClick={onClick}>Submit</button>
</div>
<pre>{code}</pre>
</div>
);
}
export default App;
我是 esBuild 和 ReactJS 的新手,根据指导,我决定构建自定义 CLI Transpiling 应用程序。 我到了要在 textarea 中输入文本的地步,但在客户端的控制台上出现了以下错误消息主机版本“0.8.27”与二进制版本“0.9.0”不匹配。我知道我使用的是旧版本,我确实尝试找到一种方法来首先通过文档来解决问题,因为他们已经完全丢弃了新版本上的 startService() 方法。但是我找不到任何可能解决我的问题的方法,是否有人有知识可以帮助我解决问题。 这是我必须开始转译的代码:
const startService = async () => {
ref.current = await esbuild.startService({
worker: true,
wasmURL: '/esbuild.wasm'
})
}
useEffect(() => {
startService()
}, [])
const onClick = async () => {
if (!ref.current) {
return;
}
const result = await ref.current.build({
entryPoints: ['index.js'],
bundle: true,
write: false,
plugins: [unpkgPathPlugin()]
})
console.log(result );
setCode(result)
}
浏览器中 运行 esbuild 的文档在此处:https://esbuild.github.io/api/#running-in-the-browser。在 0.9.0 版本中,esbuild.startService()
变成了 esbuild.initialize()
,service.build()
变成了 esbuild.build()
(即显式服务对象消失了)。所以更新后的代码可能看起来像这样:
const startService = async () => {
await esbuild.initialize({
worker: true,
wasmURL: '/esbuild.wasm'
})
ref.current = true
}
useEffect(() => {
startService()
}, [])
const onClick = async () => {
if (!ref.current) {
return;
}
const result = await esbuild.build({
entryPoints: ['index.js'],
bundle: true,
write: false,
plugins: [unpkgPathPlugin()]
})
console.log(result);
setCode(result)
}
请注意,在浏览器中 运行 时没有可用的异步 API。另外,我不想每次在编辑时热重载时都抛出 'already initialized'。这就是我的设置方式:
import { useState, useEffect } from 'react';
import './App.css';
import * as esbuild from 'esbuild-wasm';
function App() {
const [input, setInput] = useState('');
const [code, setCode] = useState('');
useEffect(() => {
// This ugly code is to avoid calling initialize() more than once
try {
esbuild.build({});
} catch (error) {
if (error instanceof Error && error.message.includes('initialize')) {
esbuild.initialize({
worker: false,
wasmURL: '/esbuild.wasm',
});
} else {
throw error;
}
}
}, []);
const onClick = () => {
esbuild
.transform(input, {
loader: 'jsx',
target: 'es2015',
})
.then((result) => {
setCode(result.code);
});
};
return (
<div className="App">
<textarea
value={input}
onChange={(e) => setInput(e.target.value)}></textarea>
<div>
<button onClick={onClick}>Submit</button>
</div>
<pre>{code}</pre>
</div>
);
}
export default App;