不使用”create-react-app” ,创建React项目
首先
这篇文章用于保存个人开发期间所获得的知识,以便随时查阅。由于可能存在言辞不准确和不恰当的地方,如果您发现了任何问题,请告知我,将不胜感激。
如果使用create-react-app来创建React应用程序,可以很方便地开始开发而不必担心详细的配置。然而,由于这些配置是隐藏的,我们也失去了理解其背后运行功能的机会。因此,我们将不使用create-react-app来构建React应用程序。
前提
假设已经安装了Node.js。
The content (of something)
请创建一个适当的目录,并在其中进行开发。你可以随意命名。然后,请移动到所创建的目录中。
创建一个Node项目
创建一个Node项目并生成package.json文件。请执行以下命令。
$ npm init -y
安装与Babel相关的软件
Babel是一种编译器,用于将后续创建的JavaScript代码转换为向后兼容的形式。例如,在支持ES5的浏览器上使用符合ES6标准的JavaScript时,Babel会将ES6 JavaScript转换为ES5 JavaScript。
React使用类似HTML的JSX语法来构建应用程序。Babel也用于转换这些语法。
执行以下命令,安装Babel及其相关软件包。
npm install --save-dev @babel/core babel-loader @babel/cli @babel/preset-env @babel/preset-react
这是已安装软件包的详细信息。
@babel/core: Babelのメインパッケージ
babel-loader: Webpackとの橋渡し?
@babel/cli: Babelをコマンドラインから使用可能にする。
@babel/preset-env: ES6に準拠したJavaScriptを古いバージョンのJavaScriptに変換するパッケージのまとまり。
@babel/preset-react: React JSXシンタックを異なるバージョンのJavaScriptに変換するパッケージ。
Webpack相关安装。
Webpack是一个将分散的文件捆绑在一起并生成一个JavaScript文件的软件包。它可以捆绑不仅仅是JavaScript文件,还包括CSS、JSON等多种文件类型。
运行以下命令,安装Webpack及相关的包。
npm install --save-dev webpack webpack-cli webpack-dev-server
以下是已安装软件包的详细信息。
webpack: Webpackのメインパッケージ
webpack-cli: Webpackをコマンドラインから使用可能にする。
webpack-dev-server: 開発環境にて簡易的にサーバーとして機能する。
安装 HtmlWebpackPlugin
HtmlWebpackPlugin是一个帮助创建主HTML文件的包。Webpack可以将多个文件转换为单个JavaScript文件,但是如果每次执行时使用不同的文件名,则主HTML无法识别哪个是捆绑的JavaScript。这时就可以使用HtmlWebpackPlugin。当Webpack捆绑所有文件时,将主HTML的源文件传递给HtmlWebpackPlugin,它会自动生成新的HTML。
执行以下命令,安装HtmlWebpackPlugin。
npm install --save-dev html-webpack-plugin
安装与React相关的依赖
请安装React和ReactDOM。请执行以下命令。
npm install react react-dom
编写HTML和JavaScript。
我将创建一个主要的HTML文件和使用React编写的JavaScript文件。首先,创建一个名为public的文件夹,在其中添加index.html文件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Reactアプリケーション</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
接下来,创建src目录,并在其中添加App.js文件。
import React from "react";
export default function App() {
return (
<h1>
Hello world!
React without create-react-app.
</h1>
)
}
返回根目录并创建一个名为index.js的文件,作为应用程序的入口点。
import React from "react"
import ReactDOM from "react-dom"
import App from './src/App.js'
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
)
我在public/index.html文件中的
标签中插入了由App.js中定义的应用程序。
巴别塔的设置
在根目录下创建一个名为.babelrc的文件,并添加以下内容。
{
"presets": ["@babel/preset-env","@babel/preset-react"]
}
这里告诉我们要使用之前安装的@babel/preset-env和@babel/preset-react在Babel中。
Webpack配置
在根目录下创建webpack.config.js文件。由于内容可能会变得复杂,因此列举出首先需要设置的项目。
entry: どのファイルを起点にバンドルを開始するか。今回の場合はindex.js
mode: バンドルするファイルに影響するプロパティ?
output: Webpackがバンドルしたファイルをどこにどんな名前で吐き出すかを指定。
target: サーバー側とブラウザ側どちらにコンパイルさせるかの設定。
devServer: 開発サーバー(webpack-dev-server)の設定。
port: 使用するポート番号を指定する
static: 静的ファイル関連
resolve: インポートする際に指定した拡張子を削除できる。
module: 異なる種類のファイルをバンドルする際に、それぞれどのように操作するかを指定する。
plugins: Webpack内で使用するプラグインを指定する。今回はHTMLWebpackPluginを利用。
const HtmlWebpackPlugin = require('html-webpack-plugin');
const path = require('path');
module.exports = {
entry: './index.js',
mode: 'development',
output: {
path: path.resolve(__dirname, './dist'),
filename: 'index_bundle.js',
},
target: 'web',
devServer: {
port: '3000',
static: {
directory: path.join(__dirname, 'public')
},
open: true,
hot: true,
liveReload: true,
},
resolve: {
extensions: ['.js', '.jsx', '.json'],
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: 'babel-loader',
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: path.join(__dirname, 'public', 'index.html')
})
]
};
在package.json中定义新命令
在根目录下,将以下内容添加到最开始生成的package.json文件中。
"scripts": {
"start": "webpack-dev-server .",
"build": "webpack ."
}
以npm run start命令来执行
可能会遇到以下错误情况,取决于指定的端口号。
Sanma 0:00:00 ~/Desktop/hoge $ npm run start
> dev@1.0.0 start
> webpacl-dev-server .
/Users/Sanma/Desktop/hoge/node_modules/webpack-dev-server/lib/Server.js:2557
throw error;
Error: listen EADDRINUSE: address already in use :::5000
在那种情况下,请更改使用的端口号。
结束了
我能够创建React应用程序而无需使用create-react-app。我被一个命令执行的复杂程度所惊讶,也被隐藏的功能数量所压倒。然而,我对应用程序开发的框架有了更深入的理解,因此可以说我的理解有了很大的进步。
谢谢您的阅读。