文章供未搭建过生产环境框架的朋友学习,不严谨处望大佬指正
Hello 小伙伴们,首先问一下你们有自己搭过react框架嘛?
demo地址:https://github.com/babybrotherzb/React-Hook
我好像听到了你们说:of course, react-app 是的说到搭建框架,现在基本都是用的脚手架,简单、快速、高效的脚手架提供给我们的只是通常最基础的一些配套设备,对于我们自己写写demo的话甚至不需要对脚手架进行改动,也就更不会改webpack的配套文件了。 然而 但如果应用到生产环境,我们需要自定义配置一些webpack的功能的话,脚手架提供的显然就不够了,这时候我们就该考虑对脚手架里的webpack "开刀" 了,接下看我们就来对webpack做一场 "手术"。
第一步搭建react-app
现在市面上的脚手架有好几种 我用官网推荐的最新脚手架一行代码搞定
npm init react-app my-app //npm
yarn create react-app my-app //yarn
想使用TypeScript进行开发的话,直接基于antd的ts脚手架就行,项目结构都是一样的,webpack文件里已经做好了兼容ts,直接使用就行,
yarn create react-app antd-demo-ts --template typescript
安装好之后项目目录结构就是这样
剥离react-scripts文件
细心的小伙伴会发现,package.json配置文件里的包很少,运行命令都是react-scripts开头,那么我们就去node_modules里找找这个react-script文件,看看它究竟是何方神圣。
package.json依赖跟着改
npm install
yarn install
我们再次运行一下看看 yarn dev
生产分环境打包应用场景
正常开发项目,在发布正式之前,一般都会有个测试环境,如果我们只打一个包用于正式和测试使用,有时候就会很尴尬,尤其是公司配置了自动发布的时候,并不知道你这个包是想发布正式还测试,这时候能按照我需求能分别打包出正式和测试包就很nice了 目标:根据命令行打包出正式或者测试两种包 思考:一个命令要想打出两个包,说明webpack出口文件肯定得有两个
行动一、那我们就找到webpack.config.js文件,找到output
++++++++++++++ 你们安装的项目注释都是英文的,我的demo里把整个webpack和脚本文件都翻译注释了一波 ,为我的辛苦点个star吧 ++++++++++++++ demo地址:https://github.com/babybrotherzb/React-Hook
行动二、我们继续找paths.js
行动三、回到wabpack修改一波paths
行动四、找到webpack方法引用和传参
找啊找,又用一个月终于在,scripts/build.js找到了webpack引用
行动五、动态添加环境变量
那就给大家推荐一个包 ” inquirer “:https://www.npmjs.com/package/inquirer 然后一波操作
行动六、打包试试结果如何
我们来试试yarn build,输入打包命令时候手动选择环境
优化—打包时生成带CDN链接的index.html
项目中为了提升用户体验,少不了使用cdn
方法一、使用模板引擎+node,动态引入打包好的文件路径
模板引擎哪家强:之前写的文章,这里就不做多介绍了
方法二、webpack的插件'html-webpack-plugin'、'webpack-manifest-plugin'了解一下
感兴趣的可以去深入研究一下
优化—打包时上传静态资源
上传操作,直接写在build.js的打包结束后执行
//config = await configFactory( env)
config = await configFactory( env, `${Domain}${Const.projectName}` );
之前这个方法我们传了一个env给webpack,上传静态资源后我们可以将cdn前缀传过去,'webpack-manifest-plugin'当成这个插件的publicPath:路径
//模拟上传操作
//************上传操作可以在这里写************* */
await startUploadImage( env, 'token', 'qiniu' )
await startUpload( env, 'token', 'qiniu' )
//************上传操作可以在这里写************* */
/**
* @desc 上传静态js/css资源
* @param {string} env 环境变量
* @param {string} token
*
*/
async function startUpload( env, token, qiniu ) {
const files = glob.sync( `${paths.appBuild}/static/{js,css}/**/*.{js,css}` )
if ( files.length === 0 ) throw new Error( '请先build环境静态资源' )
for ( let filepath of files ) {
const fileExtension = filepath.substring( filepath.lastIndexOf( '.' ) + 1 )
// 文件上传
console.log( colors.underline( filepath ) )
console.log( colors.magenta( `${ Const["domain"][env]+'static/'+fileExtension +'/'+ path.basename(filepath)}` ) )
}
}
/**
* @desc 上传静态图片资源
* @param {string} env
* @param {string} token
*
*/
async function startUploadImage( env, token, qiniu ) {
const files = glob.sync( `${paths.appBuild}/static/media/**/*.{png,jpg,gif,jpeg,svg}` )
for ( let filepath of files ) {
// 文件上传
console.log( colors.underline( filepath ) )
console.log( colors.magenta( `${ Const["domain"][env]+'static/media/' + path.basename(filepath)}` ) )
}
}
yarn build 看下执行效果
++++++++++++++ 你们安装的项目注释都是英文的,我的demo里把整个webpack和脚本文件都翻译注释了一波 ,为我的辛苦点个star吧 ++++++++++++++