从0开始React到成功部署到服务器

1,547 阅读3分钟

本文记录我从环境配置到成功将React部署到本机Apache服务器的过程及遇到的问题。

环境安装

安装node.js。个人使用VSCode进行编码,这个根据个人喜好选择就行。

工程创建

 npx create-react-app my-app
 cd my-app
 npm start

这样就完成了工程初始化。

具体如何进行开发,怎么写代码,可以阅读学习React部分。当然建议开始学习阶段先通读“高级指引”之前的所有内容。

hello world

这时候在项目目录下执行

 npm start

就可以在自动弹出的浏览器中看到效果了。

构建

要把代码部署到服务器需要先进行打包。这个过程比较痛苦,会遇到一系列问题,所以一定要做好心理准备。我从第一次打包到部署成功花费了大概5、6个小时。

首先执行

 npm run build

如果成功,那么恭喜你,你应该是天选之子,下面的部分可以直接跳过了,直接看"部署"部分就行,如果没有那是正常的,下面的内容应该会有所帮助。

webpack.config.js

看看你的项目根目录是否有webpack.config.js文件。没有的话

 npx webpack-cli init

根据提示选择,最后会在项目根目录创建webpack.config.js文件。

有几个需要关注的点

 //下面是部分文件内容
 const HtmlWebpackPlugin = require("html-webpack-plugin");
 const config = {
   entry: "./src/index.js",//1.入口文件,注意是否与自己的项目实际目录一致
   output: {
     path: path.resolve(__dirname, "dist"),
     clean: true //2.每次构建之前自动清理dist目录
  },
   devServer: {
     open: true,
     host: "localhost",
  },
   plugins: [
     new HtmlWebpackPlugin({
       template"index.html",//自动生成index.html模板,如果没有这个,构建结果里面是没有index.html文件的,但是默认的模板与react不兼容。可以直接把public/index.html的文件内容复制粘贴到根目录的这个模板里来解决。
    }),
  ]
  }

HtmlWebpackPlugin.apply

Q:HtmlWebpackPlugin打包报错:TypeError: Cannot read property ‘tap‘ of undefined at HtmlWebpackPlugin.apply。

A:package.json文件

 "html-webpack-plugin": "^5.3.1",
 //替换为
 "html-webpack-plugin": "^4.4.1",

Support for the experimental syntax 'jsx' isn't currently enabled

查看项目根目录,是否有.babelrc文件,没有的话创建一个,文件内入填入

 {
   "plugins": ["@babel/syntax-dynamic-import"],
   "presets": ["@babel/preset-env""@babel/preset-react"]
 }

以上只是我遇到的问题的一小部分。如果你遇到问题,一定不要着急,仔细阅读错误信息,Google,阅读文档,一定能找到解决方法。

部署

如果构建成功,就可以来到最后一步了。之所以部署到apache是因为mac系统自带。首先将刚才打包好的dist目录下的文件都拷贝到/Library/WebServer/Documents

接下来执行

 sudo apache start

在浏览器地址栏输入localhost,就能看到你的网页了。

这里额外讲一个我遇到的坑。如果你的网站有多个页面,那么很有可能遇到其他页面都是404的问题。我使用react-router-dom进行路由就遇到这个问题。根本原因是react是单页应用,不管访问啥地址都要重写到根目录的index.html。

首先在index.html目录下创建.htaccess文件,填入以下内容,由于这些目录都需要root权限,因此推荐命令行操作,sudo vi .htaccess了解一下。其他不懂的可以先简单学一下vim。

 Options -MultiViews
 RewriteEngine On
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^ index.html [QSA,L]

然后去/etc/apache2目录,打开https.conf,搜索rewrite_module,删掉最前面的“#”,保存。重启服务器

 sudo apache restart

这次应该可以顺利跳转了。开启react之旅吧。