1.打开新建的项目空文件夹,终端输入命令:npm init,文件夹生成package.json文件;

2.安装webpack、webpack-cli和cross-env:npm install webpack webpack-cli cross-env --save-dev;

3.在根目录下新建src文件夹,文件夹下新建index.js文件,作为被编译文件webpack及webpack的入口文件;

4.在根目录下新建webpack.config.js文件作为webpack核心配置文件;

5.在webpack.config.js文件添加如下代码:

  1. const path = require('path')
  2.  
  3. const isLocal = process.env.LOCAL === 'true'
  4.  
  5. module.exports = {
  6. mode: isLocal ? 'production' : 'development', // 表示webpack打包环境是开发环境还是生产环境
  7. entry: './src/index.js', // 项目的入口文件,路径相对于项目的根路径
  8. // 配置输出信息
  9. output: {
  10. filename: 'bundle.js', // 打包输出文件名,后期可改成按规则动态生成
  11. path: path.resolve(__dirname, './dist'), // 输出的路径,路径是当前目录
  12. }
  13. }

6.在index.js文件添加如下代码:

  1. function sum (a, b) {
  2. return a + b;
  3. }
  4. var result = sum (12, 23);
  5. console.log(result);

7.在package.json的script属性下添加如下行:

  1. "build": "cross-env LOCAL=false webpack"

8.终端输入命令:npm run build,运行成功且根目录出现dist文件夹并且有打包出的bundle.js文件,说明打包配置成功;

9.开始做高级语法转换为ES5的配置,先安装相关插件:npm install babel-loader @babel/core @babel/preset-env @babel/preset-react @babel/polyfill @babel/runtime @babel/plugin-transform-runtime @babel/plugin-syntax-dynamic-import --save-dev;

10.根目录下新建babel.config.js文件,添加如下配置,或者直接写在webpack.config.js文件内:

  1. const babelConfig = {
  2. // 相当于plugins的一个集合,即插件集,就不需要在plugins中一个个插件的配置了
  3. presets: [
  4. [
  5. '@babel/preset-env',
  6. {
  7. useBuiltIns: 'entry', // 如果引入了@babel/polyfill,这个属性可以使@babel/polyfill按需引入
  8. corejs: 2,
  9. },
  10. ],
  11. '@babel/preset-react',
  12. ],
  13. plugins: ["@babel/plugin-syntax-dynamic-import", ["@babel/plugin-transform-runtime"]], // @babel/runtime中的插件
  14. }
  15.  
  16. module.exports = babelConfig

11.回到webpack.config.js内添加日下babel配置,如下:

  1. const path = require('path')
  2.  
  3. const isLocal = process.env.LOCAL === 'true'
  4.  
  5. module.exports = {
  6. mode: isLocal ? 'production' : 'development', // 表示webpack打包环境是开发环境还是生产环境
  7. entry: './src/index.js', // 项目的入口文件,路径相对于项目的根路径
  8. // 配置输出信息
  9. output: {
  10. filename: 'bundle.js', // 打包输出文件名,后期可改成按规则动态生成
  11. path: path.resolve(__dirname, './dist'), // 输出的路径,路径是当前目录
  12. },
  13. module: {
  14. rules: [
  15. {
  16. // 配置babel-loader
  17. test: /\.js/,
  18. use: ['babel-loader?cacheDirectory=true'],
  19. include: path.join(__dirname, './src'),
  20. }
      ]
  21. }
  22. }

12.将index.js文件内函数改为箭头函数并添加Promise,保存后再次打包,能够正常打包并将转换后代码保存到bundle.js,代表babel配置成功;

13.css预处理器转换配置,先安装相关插件:npm install stylus stylus-loader less less-loader sass-loader node-sass css-loader style-loader --save-dev,并添加如下配置:

  1. const path = require('path')
  2.  
  3. const isLocal = process.env.LOCAL === 'true'
  4.  
  5. module.exports = {
  6. mode: isLocal ? 'production' : 'development', // 表示webpack打包环境是开发环境还是生产环境
  7. entry: './src/index.js', // 项目的入口文件,路径相对于项目的根路径
  8. // 配置输出信息
  9. output: {
  10. filename: 'bundle.js', // 打包输出文件名,后期可改成按规则动态生成
  11. path: path.resolve(__dirname, './dist'), // 输出的路径,路径是当前目录
  12. },
  13. module: {
  14. rules: [
  15. {
  16. // 配置babel-loader
  17. test: /\.js/,
  18. use: ['babel-loader?cacheDirectory=true'],
  19. include: path.join(__dirname, './src'),
  20. },
        // 版本不同,写法也不同
  21. {
  22. test: /\.(less)$/,
  23. use: [
  24. {
  25. loader: 'style-loader',
  26. },
  27. {
  28. loader: 'css-loader',
  29. },
  30. {
  31. loader: 'postcss-loader',
  32. options: {
  33. postcssOptions: {
  34. ident: 'postcss',
  35. plugins: [require('autoprefixer')],
  36. },
  37. },
  38. },
  39. {
  40. loader: 'less-loader',
  41. options: {
  42. lessOptions: {
  43. javascriptEnabled: true,
  44. },
  45. },
  46. },
  47. ],
  48. }
      ]
  49. }
  50. }

14.src目录新增index.less文件,写入如下代码:

  1. @color: green;
  2.  
  3. h {
  4. color: @color;
  5. }

15.index.js文件引入样式文件,重新打包,可以看到新写的样式文件被打包进bundle.js文件;

16.配置处理静态资源文件,安装相关插件:npm install file-loader url-loader --save-dev,并添加如下配置:

  1. const path = require('path')
  2.  
  3. const isLocal = process.env.LOCAL === 'true'
  4.  
  5. module.exports = {
  6. mode: isLocal ? 'production' : 'development', // 表示webpack打包环境是开发环境还是生产环境
  7. entry: './src/index.js', // 项目的入口文件,路径相对于项目的根路径
  8. // 配置输出信息
  9. output: {
  10. filename: 'bundle.js', // 打包输出文件名,后期可改成按规则动态生成
  11. path: path.resolve(__dirname, './dist'), // 输出的路径,路径是当前目录
  12. },
  13. module: {
  14. rules: [
  15. {
  16. // 配置babel-loader
  17. test: /\.js/,
  18. use: ['babel-loader?cacheDirectory=true'],
  19. include: path.join(__dirname, './src'),
  20. },
  21.     // 版本不同,写法也不同
  22. {
  23. test: /\.(less)$/,
  24. use: [
  25. {
  26. loader: 'style-loader',
  27. },
  28. {
  29. loader: 'css-loader',
  30. },
  31. {
  32. loader: 'postcss-loader',
  33. options: {
  34. postcssOptions: {
  35. ident: 'postcss',
  36. plugins: [require('autoprefixer')],
  37. },
  38. },
  39. },
  40. {
  41. loader: 'less-loader',
  42. options: {
  43. lessOptions: {
  44. javascriptEnabled: true,
  45. },
  46. },
  47. },
  48. ],
  49. },
  50. {
  51. test: /\.(jpg|png|jpeg|gif)$/,
  52. use: [
  53. // file-loader打包的图片或文件会生成一个随机的hash值作为图片名字,url-loader封装了file-loader,文件大小小于limit,url-loader会把文件转为base64,大于limit则调用file-loader进行处理,参数也会直接传给file-loader
  54. {
  55. loader: 'url-loader',
  56. options: {
  57. limit: 4096,
  58. fallback: {
  59. loader: 'file-loader',
  60. options: {
  61. name: 'img/[name].[hash:8].[ext]',
  62. },
  63. },
  64. },
  65. },
  66. ],
  67. },
  68. {
  69. test: /\.(mp4|webm|ogg|mp3|wav)$/,
  70. use: [
  71. {
  72. loader: 'url-loader',
  73. options: {
  74. limit: 4096,
  75. fallback: {
  76. loader: 'file-loader',
  77. options: {
  78. name: 'media/[name].[hash:8].[ext]',
  79. },
  80. },
  81. },
  82. },
  83. ],
  84. }
  85.   ]
  86. }
  87. }

17.src文件夹内新建asset文件夹并添加两张图片,在index.js引入两张图片,保存后重新打包,可以看到图片也被打包到dist文件夹的img文件夹内,文件名为上述options属性配置的name;

18.抽离公共代码,在webpack.config.js内添加如下配置:

  1. optimization: {
  2. splitChunks: {
  3. cacheGroups: {
  4. // 打包公共模块
  5. commons: {
  6. chunks: 'initial', // initial表示提取入口文件的公共部分
  7. minChunks: 2, // 表示提取公共部分最少的文件数
  8. minSize: 0, // 表示提取公共部分最小的大小
  9. name: 'commons', // 提取出来的文件命名
  10. },
  11. },
  12. },
  13. }

19.添加文件别名、文件扩展名配置,在webpack.config.js内添加如下配置:

  1. resolve: {
  2. extensions: ['.js', '.jsx', '.json'],
  3. alias: {
  4. pages: path.join(__dirname, './src/pages'),
  5. components: path.join(__dirname, './src/components'),
  6. actions: path.join(__dirname, './src/redux/actions'),
  7. reducers: path.join(__dirname, './src/redux/reducers'),
  8. images: path.join(__dirname, './src/images'),
  9. },
  10. }

20.配置文件热更新,安装相关插件:npm install webpack-dev-server html-webpack-plugin --save-dev,并在webpack.config.js内添加如下配置:

引入插件:

  1. const HtmlWebpackPlugin = require('html-webpack-plugin')
  1.  
  plugins: [
    // 实例化Html模板
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, './index.html'),
    }),
  ],
  1. devServer: {
  2. hot: true,
  3. open: true,
  4. port: 8080,
  5. static: './dist',
  6. historyApiFallback: true, // 解决启动后刷新404
    }

21.在package.json文件添加如下行:

  1. "dev": "cross-env LOCAL=true webpack-dev-server"

终端运行命令:npm run dev,浏览器自动打开http://localhost:8080页面,修改index.js文件页面会跟着改动,热更新配置成功;

22.清理上一次打包记录和结果,安装插件:npm install clean-webpack-plugin --save-dev,并进行如下配置:

引入插件:

  1. const { CleanWebpackPlugin } = require('clean-webpack-plugin')
  1. plugins: [
  2. new CleanWebpackPlugin(), //实例化clean-webpack-plugin插件
  3. new HtmlWebpackPlugin({
  4. template: path.resolve(__dirname, '../index.html')
  5. })
  6. ]

23.集成react,安装相关插件:npm install react react-dom --save-dev,npm install react-router-dom --save-dev;

24.引入antd design,安装相关插件:npm install antd --save-dev;

25.添加express和axios,打通前后端,安装插件:npm install express axios --save-dev,根目录新增server.js文件,添加如下代码:

  1. const express = require('express')
  2. const app = express()
  3.  
  4. app.get('/api/xxx', (req, res) => {
  5. res.header('Access-Control-Allow-Origin', '*')
  6. res.send({
  7. name: 'xxxxxx',
  8. comurl: 'baidu.com',
  9. })
  10. })
  11.  
  12. app.listen(3000, () => {
  13. console.log('app listen 3000 port')
  14. })

26.终端输入命令:node server.js运行文件,在浏览器打开链接:http://localhost:3000/api/xxx,可以看见server文件里面写的测试数据;

27.以下命令可以调用这个接口获取到返回的数据:

  1. axios.get('http://localhost:3000/api/xxx').then(res => {
  2. console.log(res)
  3. })

28.请求接口遇到跨域问题需要添加跨域配置,在webpack.config.js内添加如下配置:

  1. devServer: {
  2. hot: true,
  3. open: true,
  4. port: 8080,
  5. static: './dist',
  6. historyApiFallback: true, // 解决启动后刷新404
  7. proxy: {
  8. '/api': {
  9. target: 'http://localhost:3000',
  10. pathRewrite: {
  11. '^/api': '/api',
  12. },
  13. changeOrigin: true, // 让target参数是域名
  14. secure: false,// 设置支持https协议代理
  15. },
  16. }
  17. }

搭建react项目的更多相关文章

  1. 手把手教你用webpack3搭建react项目(开发环境和生产环境)(一)

    开发环境和生产环境整个配置源码在github上,源码地址:github-webpack-react 如果觉得有帮助,点个Star谢谢!! (一)是开发环境,(二)是生产环境. 一.首先创建packag ...

  2. [Web 前端] webstorm 快速搭建react项目

    cp from : https://blog.csdn.net/qq_39207948/article/details/79467144 前端新手如何安装webstorm ,初步搭建react项目 下 ...

  3. 使用webpack搭建react项目 webpack-react-project

    webpack-react-project 使用webpack搭建react项目 webpack搭建react项目 github源码 具体配置信息参照package.json和webpack.conf ...

  4. 使用 webpack 搭建 React 项目

    简评:相信很多开发者在入门 react 的时候都是使用 create-react-app 或 react-slingshot 这些脚手架来快速创建应用,当有特殊需求,需要修改 eject 出来的 we ...

  5. 从零开始使用 webpack5 搭建 react 项目

    本文的示例项目源码可以点击 这里 获取 一.前言 webpack5 也已经发布一段时间了,其模块联邦.bundle 缓存等新特性值得在项目中进行使用.经过笔者在公司实际项目中的升级结果来看,其提升效果 ...

  6. 前端新手如何安装webstorm ,初步搭建react项目

    下载安装webstorm:配置成功: 配置成功后就可以开启webstorm项目了.(存微信收藏..) 1:在webstorm下配置node环境: 2:完成之后: React官方脚手架地址: https ...

  7. 🌅 使用 Dawn 快速搭建 React 项目!

    开发一个 React 项目,通常避免不了要去配置 Webpack 和 babel 之类,以支持 commonjs 或 es 模块及各种 es 新语法,及进行 jsx 语法的转义.当然也可以用 crea ...

  8. 搭建React项目环境【1】

    1.安装NodeJS6.0以上自带npm依赖包管理工具 2.webstrom 2019.2 工具 1.在cmd输入node -v就可以看到node的当前版本 2.在输入node进入node环境 3.查 ...

  9. 快速搭建react项目骨架(按需加载、redux、axios、项目级目录等等)

    一.前言 最近整理了一下项目骨架,顺便自定义了一个脚手架,方便日后使用.我会从头开始,步骤一步步写明白,如果还有不清楚的可以评论区留言.先大致介绍一下这个骨架,我们采用 create-react-ap ...

  10. 使用脚手架快速搭建React项目

    create-react-app是Facebook官方推出的脚手架,基本可以零配置搭建基于webpack的React开发环境步骤: 打开控制台 进入你想要创建项目的目录文件下面 依次执行以下命令 np ...

随机推荐

  1. SQL语句大全,你不会写的SQL可能都在这里

    1.创建数据库 CREATE DATABASE database-name 2.删除数据库 drop database dbname3.说明:备份sql server 创建 备份数据的 device ...

  2. 并发多线程学习(六)Java线程间的通信

    合理的使用Java多线程可以更好地利用服务器资源.一般来讲,线程内部有自己私有的线程上下文,互不干扰.但是当我们需要多个线程之间相互协作的时候,就需要我们掌握Java线程的通信方式.本文将介绍Java ...

  3. RHEL8注册

    安装RHEL后,因为是商用系统,YUM软件仓库是不能使用的,需要注册后才可以使用.个人用户可以去红帽官网申请开发者账户. https://developers.redhat.com/ 有了开发者账户后 ...

  4. Linux上面配置Apache2支持Https(ssl)具体方案实现

    虽然Nginx比较流行,但是由于一些老项目用到了Apache2来支持Web服务,最近想给服务上一个Https支持,虽然看似教程简单,但是也遇到一些特殊情况,经历了一番折腾也算是解决了所有问题,将过程记 ...

  5. git常见问题集合

    注1:问题总结来自于实际使用,关于搜到的资料链接一并粘贴; 场景1:GIT本地代码处于detached HEAD的情况(又称游离状态)的解决办法; 问题:有时候git由于一些操作的问题出现了detac ...

  6. dev随笔记录

    gridcontrolbandedGridviewPrintHeader = false(不显示列头)#region 勾选框全选或反选 List<string> islockList = ...

  7. 运行Django项目报错

    运行 pip install -r requirements.txt -i https://pypi.douban.com/simple

  8. 从零搭建hadoop集群之hadoop集群安装

    1.集群规划   HDSF YARN hadoop01 NanemNode(主机点),DataNode NodeManager hadoop02 DataNode, SecondaryNamenode ...

  9. astrocut:切割fitsfile

    from astrocut import fits_cut from astropy.io import fits from astropy.coordinates import SkyCoord i ...

  10. unity ScriptObject使用

    转自 https://www.jianshu.com/p/77fabc83555b using UnityEngine; [CreateAssetMenu(fileName = "Untit ...