create-react-app 是 React 官方为咱们提供的一个单页应用脚手架,基于 webpack 配置了相关功能,babel、 图片处理、热加载、css 模块化、css 预处理器转换、代码分隔、生产构建、测试等。文档在这 create-react-app。强烈建议去看一看。
建议使用 npx create-react-app myapp
本地安装,而不是全局安装,以便更好的管理项目。javascript
在必定程度上来讲,官方提供的脚手架已经接近完美了,接下来,扩展让它更完美。css
脚手架默认把 webpack 等繁琐复杂的配置给隐藏起来了,目的是让开发者专一于项目。但也提供了一个命令npm run eject
来暴露相关配置,但这个行为是不可逆的。前端
咱们要作的是锦上添花,在不暴露相关配置的状况下进行。java
在实际中,好比有多个应用,那么端口号冲突是很常见的,那么如何修改默认端口号呢?node
npm install --save-dev cross-env
,保证兼容性,由于 window 不支持直接PORT=5000 node scripts/start.js
cross-env PORT=设置的端口号
"scripts": { "start": "cross-env PORT=5000 node scripts/start.js" },
在实际应用中,打包后的资源须要使用相对路径,只需在 package.json
中进行以下配置:react
{ "scripts": { ... }, "homepage": "." }
使用 react-app-rewired,安装这个工具后,在项目根目录中新建文件 config-overrides.js 文件。此时咱们即可以在其中进行各类 webpack 的配置了~webpack
可是!react-app-rewired2.x 之后,再也不支持 injectBabelPlugin 的方式,须要安装 customize-cra。ios
具体的,ant design 官方文档已经给出了最新的解决方案。请前往详览。https://ant.design/docs/react/use-with-create-react-app-cngit
这种方式就是咱们推荐的方式。由于无需生成更多额外的文件,同时配置又趋于更简单可控的方式。github
具体的操做步骤:
首先,安装 react-app-rewired:
npm install react-app-rewired --save-dev
而后修改package.json文件以下:
/* package.json */ "scripts": { - "start": "react-scripts start", + "start": "react-app-rewired start", - "build": "react-scripts build", + "build": "react-app-rewired build", - "test": "react-scripts test", + "test": "react-app-rewired test", }
接着,安装 customize-cra:
npm install customize-cra --save-dev
而后在根目录下添加 config-overrides.js文件,并进行配置,配置可参考customize-cra 文档:
使用 babel-plugin-import,它是一个用于按需加载组件代码和样式的 babel 插件。
npm install babel-plugin-import --save-dev
配置 webpack:
/* config-overrides.js */ + const { override, fixBabelImports } = require('customize-cra'); + module.exports = override( + fixBabelImports('import', { + libraryName: 'antd', + libraryDirectory: 'es', + style: 'css', + }), + );
按照配置主题的要求,自定义主题须要用到 less 变量覆盖功能。
安装less和less-loader
npm install less less-loader --save-dev
配置 webpack:
/* config-overrides.js */ - const { override, fixBabelImports } = require('customize-cra'); + const { override, fixBabelImports, addLessLoader } = require('customize-cra'); module.exports = override( fixBabelImports('import', { libraryName: 'antd', libraryDirectory: 'es', - style: 'css', + style: true, }), + addLessLoader({ + javascriptEnabled: true, + modifyVars: { '@primary-color': '#1DA57A' }, + }), );
这里利用了less-loader的modifyVars来进行主题配置。固然这里的modifyVars的值也能够是一个theme文件。
/* config-overrides.js */ const { override, fixBabelImports, addLessLoader } = require("customize-cra"); + process.env.GENERATE_SOURCEMAP = "false"; module.exports = override( fixBabelImports("import", { libraryName: 'antd', libraryDirectory: "es", style: true, }), addLessLoader({ javascriptEnabled: true, modifyVars: { '@primary-color': '#1DA57A' }, }) );
const { override, fixBabelImports, addLessLoader, addWebpackAlias, useBabelRc, addDecoratorsLegacy, addWebpackPlugin } = require('customize-cra'); const path = require('path') // 补充:对开发友好,打包完成桌面提醒 const WebpackBuildNotifierPlugin = require('webpack-build-notifier'); // 关闭 sourcemap process.env.GENERATE_SOURCEMAP = "false"; module.exports = override( // 按需加载 fixBabelImports('import', { libraryName: 'antd', libraryDirectory: 'es', // style: 'css' // 按需加载 style: true // antd 自定义主题 less }), // antd 自定义主题 less 变量覆盖全局 依赖 less、less-loader addLessLoader({ javascriptEnabled: true, modifyVars: { '@primary-color': '#814a96' } }), // 配置别名 addWebpackAlias({ '@': path.resolve(__dirname, 'src'), 'components': path.resolve(__dirname, 'src/components'), 'pages': path.resolve(__dirname, 'src/pages') }), // 容许使用.babelrc文件进行Babel配置。 useBabelRc(), // 装饰器 依赖 @babel/plugin-proposal-decorators addDecoratorsLegacy(), // 打包编译完成提醒 addWebpackPlugin(new WebpackBuildNotifierPlugin({ title: "My Project Webpack Build", logo: path.resolve("./img/favicon.png"), suppressSuccess: true })) )
npm install @babel/plugin-proposal-decorators --save-dev
npm install webpack-build-notifier --save-dev
前端跨域处理。
在 src 目录下新建文件 setupProxy.js
安装 http-proxy-middleware:
npm install http-proxy-middleware --save-dev
配置 setupProxy.js
const proxy = require('http-proxy-middleware') module.exports = function(app) { app.use( proxy('/api', { target: 'http://xx.xx.xx.xx:8000/', changeOrigin: true, pathRewrite: { '^/api': '' } }) ) }
使用 create-react-app 官方提供的 react-app-polyfill,而后在入口文件 index.js 中引入
npm install react-app-polyfill --save
import 'react-app-polyfill/ie9'
在实际工做中,需求肯定后,先后端每每是同步开发的,对于接口的提供,后端没那么及时,但此时前端怎么在没有后端接口的状况下,还能正常开发呢,保证功能的正常。
答案是:mock 数据。
那么如何 mock 数据呢,方式不少,好比利用 easymock 在线模拟接口数据,固然最好的方式是本身搭建 node 服务,模拟接口及数据,更灵活,也能提高技术,了解后端的一些知识,更好的沟通与交流。
在 src 目录下新建文件夹 server-node,而后在下面再建一个 index.js 做为入口文件。
koa 相关知识,请自行学习。
和前端同样,改了文件,会自动重启。
安装 nodemon:
npm install nodemon --save-dev
配置 package.json
scripts: { server: 'nodemon server-node/index.js' }
大概就这些了,有更好的建议或配置的,也请多多指教~~