尽量简单地部分引入React
在所谓的传统环境中,SPA前端并没有像Laravel或RubyOnRails这样的MPA应用那样充满活力。请注意,这并不是说MPA不好。考虑到最近的SSR等趋势,我认为MPA也有其优点。
在这种环境下,很多时候会使用jQuery等工具来编写代码,而不是React。但是最近观察流行趋势时,我经常会有想要写声明式UI和使用React的感觉。
因此,本次将介绍两种在传统环境中使用React的方法。此外,由于更改生产环境非常困难且影响范围广,所以我们将介绍尽可能简单的引入方法。
使用CDN
可以利用CDN发布的React进行开发。
虽然这种方法在官方文档中有介绍,也很容易上手,但也有很多限制。
您可以下载文件并将其安装在本公司服务器上进行使用,而不是使用CDN服务。
// 開発環境
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
// 本番環境
<script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
代码示例
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<div id="root"></div>
const root = document.querySelector("#root");
const App = ()=>{
return (<div>Reactの出力</div>);
};
ReactDOM.render(<App />, root);
好处
只需在现有项目中添加script标签,就能轻松引入React,这一点非常具有魅力。
缺点 (quē
这个库很难用
因为我需要加载和使用CDN上公开的库,所以非常不方便和难以使用(很抱歉如果有其他方法)
虽然诸如cdnjs之类的平台上有许多库可以使用,但并不是所有库都能在上面找到,所以经常无法使用。
写不出复杂处理的代码
因为它不是以SPA应用程序的形式构建,所以处理路由等操作很困难
无法共享页面之间的状态(虽然可以通过cookie实现,但在这里指的是仅限于React世界)
我不会写TypeScript
我还是想用TypeScript写…
读取本地构建的内容
使用此方法,为本地开发环境准备Node.js环境,并使用Webpack进行构建。通过在脚本标签中引入输出的JS文件,可以使用React。这样可以解决之前的问题,例如难以使用库或无法使用TypeScript等。
在我引入时,除了现有的容器环境外,我还创建了一个用于React开发的容器,使用Node.js。由于只是开发环境的更改,所以能够进行修正而不影响生产环境。
步驟
建立Docker环境
我使用以下的形式创建了Dockerfile,并在docker-compose.yml中进行了加载。
如果在现有项目中已经确定了保存JS等文件的位置,请挂载该目录。
(在初次启动时可能会出现错误,因为没有webpack。在这种情况下,请先在本地安装,然后再启动或者先注释掉CMD再启动,在安装后重新启动)
FROM node:17.4.0-bullseye-slim
WORKDIR /src
CMD ["npx", "webpack", "--watch"']
2. 写React
请参照CDN示例,使用React进行编写。
进行设定
首先需要安装库。这次我们安装了以下库。
{
"name": "react-sample",
"version": "1.0.0",
"devDependencies": {
"@babel/core": "^7.19.6",
"@babel/preset-env": "^7.19.4",
"@babel/preset-react": "^7.18.6",
"@babel/register": "^7.18.9",
"@types/react": "^18.0.23",
"@types/react-dom": "^18.0.7",
"babel-loader": "^8.2.5",
"html-webpack-plugin": "^5.5.0",
"ts-loader": "^9.4.1",
"typescript": "^4.8.4",
"webpack": "^5.74.0",
"webpack-cli": "^4.10.0",
"webpack-dev-server": "^4.11.1"
},
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
}
}
此外,如果要使用TypeScript进行开发,我们需要先创建一个tsconfig.json文件。
{
"compilerOptions": {
"allowJs": true,
"alwaysStrict": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"isolatedModules": true,
"jsx": "preserve",
"lib": ["dom", "es2017"],
"module": "esnext",
"moduleResolution": "node",
"noEmit": true,
"noFallthroughCasesInSwitch": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"strict": true,
"target": "esnext",
"allowSyntheticDefaultImports": true,
"baseUrl": "./"
}
}
最後,我们将进行Webpack的配置。以下是config的示例。如果要使用,请适当更改文件路径。
以下是三个要点。
-
- TypeScriptを使えるようにする
-
- 変更の監視は特定のディレクトリだけにする
watchFilesで監視するファイルを指定します
必要のないファイルまで監視してしまうと重くなったり、意図しないビルドが発生してしまう可能性があるので(既存プロジェクトの場合は特に)、最低限のファイルを監視しています。
複数のファイルを生成する
SPAではないので、ページごとにビルドする必要があります
ここではentryとoutputの部分でそれを実現しています
ファイルを増やす場合はentryの部分に追加してください
require('@babel/register');
const path = require('path');
const TerserPlugin = require('terser-webpack-plugin');
const src = path.resolve(__dirname, 'data/static/js/react');
const dist = path.resolve(__dirname, 'data/static/js/react/dist');
module.exports = {
mode: 'development',
entry: {
sample: src +'/frontend/sample/index.jsx',
},
output: {
path: dist,
filename: '[name].bundle.js'
},
module: {
rules: [
{
test: /\.jsx$/,
exclude: /node_modules/,
use: [
{
loader: "babel-loader",
options: {
presets: [
"@babel/preset-env",
"@babel/react"
]
}
}
]
},
{
test: /\.tsx?$/,
exclude: /node_modules/,
use: [
{
loader: "babel-loader",
options: {
presets: [
"@babel/preset-env",
"@babel/react"
]
}
},
{ loader: "ts-loader" }
],
}
]
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx']
},
optimization: {
minimizer: [new TerserPlugin({
extractComments: false,
})],
},
plugins: [],
performance: {
maxEntrypointSize: 500000,
maxAssetSize: 500000,
},
watchOptions: {
ignored: ['**/node_modules'],
},
devServer: {
watchFiles: ["data/static/js/react/**"],
},
}
编译并确认显示
当启动Docker时,Webpack将以监控模式运行,因此在启动和修改时都会进行构建。然后,构建后的JS文件将输出到指定为Webpack output的目录中。
我们在现有的网站上加载这个JS文件并进行页面显示。由于没有热重载功能,所以需要手动重新加载。
优点
可以解决CDN方法的缺点
之前的缺点,现在可以方便地使用库和TypeScript。
缺点
有时候JS文件的大小会增大。根据规模不同,构建后的JS文件可能会变得很大,并导致性能下降。根据情况,建议仅从CDN加载React文件。
总结
在这篇投稿中,我介绍了两种在传统环境中常见的使用React作为前端网站的方法。但是一旦开始写React,就会不满足于仅仅使用React,接下来想要使用Next.js进行服务器端渲染…等等。
由于从一开始就完全替换是相当困难的,因此我希望借此机会来彻底安装前端服务器,并将其作为迈向现代化环境的起点!
文献引用