从零开始React项目架构(四)
前言
使用当前的webpack配置能不能打包构建项目呢?当然可以,但这不是我们想要的,所以,让我们来看一看生产环境需要怎么配置webpack吧
开发
- 生产环境配置
在根目录创建webpack.pro.config.js
const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')module.exports = {entry:{main:['babel-polyfill','./src/index.js'], vendors: ['react','react-dom','react-router-dom','whatwg-fetch']},output:{path:path.resolve(__dirname,'dist'),filename:'bundle.[hash:4].js'},module:{rules:[{ test: /\.(woff|eot|ttf|svg|png|jpg)$/, use: [ { loader: 'url-loader', options: { limit: '1024' ,name: '[name].[hash:4].[ext]' } }, ] },{ test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,use: [ { loader: 'url-loader', options: { limit: '1024',name: '[name].[hash:4].[ext]' } }, ] },{test: /\.(css|less)$/,use: ExtractTextPlugin.extract({fallback: 'style-loader',use: ["css-loader","less-loader"]})},{test:/\.(js|jsx)$/,use:"babel-loader",exclude:/node_modules/}]},devtool: false,plugins:[// html 模板插件new HtmlWebpackPlugin({template:'./src/index.html',favicon: './public/favicon.png'}),// 启用作用域提升,让代码文件更小、运行的更快new webpack.optimize.ModuleConcatenationPlugin(),// 提取公共代码vendorsnew webpack.optimize.CommonsChunkPlugin({name:'vendors',filename:'[name].[hash:4].js'}),// 抽离出cssnew ExtractTextPlugin("style.css"),// 压缩js代码new webpack.optimize.UglifyJsPlugin({compress: {warnings: false,drop_console: true,pure_funcs: ['console.log']}}),// 定义全局常量new webpack.DefinePlugin({"process.env": {"NODE_ENV": JSON.stringify("production")}}),// 加署名new webpack.BannerPlugin('Copyright by Zero https://github.com/l-Lemon/blog')]
}
复制代码
在package.json
的 script 中加入
"build": "webpack --config webpack.pro.config.js"
复制代码
运行 npm run build
根目录会生成 dist
文件夹 和压缩后的代码。
- 抽离公共的webpack配置
我们发现生产环境和开发环境中的webpack配置有很多相同的配置,为了维护性我们最好抽离出来。
创建webapck.base.js
文件来存我们公共配置
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
// 抽离css
const extractCss = new ExtractTextPlugin("style.css")
// html 模版
const htmlTemplate = new HtmlWebpackPlugin({template:'./src/index.html',favicon: './public/favicon.png'})
const config = {output:{path:path.resolve(__dirname,'dist'),filename:'bundle.[hash:4].js'},module:{rules:[{ test: /\.(woff|eot|ttf|svg|png|jpg)$/, use: [ { loader: 'url-loader', options: { limit: '1024' ,name: '[name].[hash:4].[ext]' } }, ] },{ test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,use: [ { loader: 'url-loader', options: { limit: '1024',name: '[name].[hash:4].[ext]' } }, ] },{test: /\.(css|less)$/,use: ExtractTextPlugin.extract({fallback: 'style-loader',use: ["css-loader","less-loader"]})},{test:/\.(js|jsx)$/,use:"babel-loader",exclude:/node_modules/}]},
}module.exports = {htmlTemplate,extractCss,config
}
复制代码
- 重构开发环境配置
修改开发环境的webpack.config.js
为
const path = require('path')
const baseConfig = require('./webpack.base')module.exports = {entry:{main:['babel-polyfill','./src/index.js'],},...baseConfig.config,plugins:[baseConfig.htmlTemplate,baseConfig.extractCss],devServer:{contentBase: path.join(__dirname, "dist"),compress: true,port: 9000,proxy: {"/api": {target: "http://127.0.0.1:3000/",pathRewrite: {"^/api" : ""}}}}
}
复制代码
- 重构生产环境配置
修改开发环境的webpack.pro.config.js
为
const webpack = require('webpack')
const baseConfig = require('./webpack.base')module.exports = {entry:{main:['babel-polyfill','./src/index.js'],// 将第三方库包单独打包,充分利用浏览器缓存 vendors: ['react','react-dom','react-router-dom','whatwg-fetch']},...baseConfig.config,devtool: false,plugins:[// html 模板插件baseConfig.htmlTemplate,// 启用作用域提升,让代码文件更小、运行的更快new webpack.optimize.ModuleConcatenationPlugin(),// 提取公共代码vendorsnew webpack.optimize.CommonsChunkPlugin({name:'vendors',filename:'[name].[hash:4].js'}),// 抽离出cssbaseConfig.extractCss,// 压缩js代码new webpack.optimize.UglifyJsPlugin({compress: {warnings: false,drop_console: true,pure_funcs: ['console.log']}}),// 定义全局常量new webpack.DefinePlugin({"process.env": {"NODE_ENV": JSON.stringify("production")}}),// 加署名new webpack.BannerPlugin('Copyright by Zero https://github.com/l-Lemon/blog')]
}
复制代码
好了,现在我们再来试试npm run dev
和npm run build
命令,没问题都可以完美运行。
总结
这篇文章我们介绍了生产环境webpack的配置,并且抽出了公共配置,重构了开发环境和生产环境的配置。
下篇我们来介绍实现单元测试
系列文章
- 从零开始React项目架构(一)
- 从零开始React项目架构(二)
- 从零开始React项目架构(三)
源码
React项目架构
从零开始React项目架构(四)相关推荐
- 【React项目架构 】+后台管理系统cms实操
React项目架构 一. react脚手架 (一) .yarn 安装 (二) .react安装 npx create-react-app [-g] npm i react@17.0.0 react-d ...
- react antd confirm content list_react简单的项目架构搭建过程
前言 react官方推荐的脚手架create-react-app因为想给用户的最大自由度所以并没有像vue的脚手架那样生成的项目架构那么齐全,用这个写写demo还行,但是真正用在项目上还是不太合适的. ...
- 【Java EE】从零开始写项目【总结】
从零开发项目概述 最近这一直在复习数据结构和算法,也就是前面发出去的排序算法八大基础排序总结,Java实现单向链表,栈和队列就是这么简单,十道简单算法题等等- 被虐得不要不要的,即使是非常简单有时候绕 ...
- 160921、React入门教程第一课--从零开始构建项目
工欲善其事必先利其器,现在的node环境下,有太多好用的工具能够帮助我们更好的开发和维护管理项目. 我本人不建议什么功能都自己写,我比较喜欢代码复用.只要能找到npm包来实现的功能,坚决不自己敲代码. ...
- 从零开始一个webpack+react项目
从零开始一个webpack+react项目 最近在做react组件化的分享,从项目中抽离组件,那么第一步自然是搭建相关的环境 本篇旨在从零开始,用最少的配置.最少的代码.最少的依赖来搭建一个最简单的w ...
- 从零开始搭建一个react项目
Nav logo 120 发现 关注 消息 4 搜索 从零开始搭建一个react项目 96 瘦人假噜噜 2017.04.23 23:29* 字数 6330 阅读 32892评论 31喜欢 36 项目地 ...
- react项目_如何从零开始创建React项目(三种方式)
在开发React项目前最关键的当然是项目的创建,现在的前端工程化使得前端项目的创建也变得越来越复杂,在这里介绍三种从零开始创建React项目的方式,分别是在浏览器中直接引入.使用官方脚手架create ...
- python接口自动化(四十二)- 项目架构设计之大结局(超详解)
简介 这一篇主要是将前边的所有知识做一个整合,把各种各样的砖块-模块(post请求,get请求,logging,参数关联,接口封装等等)垒起来,搭建一个房子.并且有很多小伙伴对于接口项目测试的框架一筹 ...
- React从零开始搭建项目
一.脚手架创建React项目 二. 删除src目录下的所有文件 三.创建App.js import React, {Component} from "react";/* 应用的根组 ...
最新文章
- Unit Test测试框架中的测试的执行顺序
- Tungsten Fabric SDN — VNC API — API Client 的 Python SDK
- Vue单文件组件与vue-loader
- LeetCode 170. 两数之和 III - 数据结构设计(哈希map)
- 使用github+hexo搭建静态blog
- pyvex 的正确安装方式
- 原生开发小程序 和 wepy 、 mpvue 对比
- jeewx 微信管家 - 举办商业版本免费试用活动
- 对“优秀工程师”的一点感悟
- JSK-24 函数规律【基础】
- 量子力学概论_科学网—《量子力学导论》潘必才 - 中国科大出版社的博文
- Permute 3.6.5 小巧便捷的多媒体文件格式转换器
- bulma.css_在5分钟内学习Bulma CSS-初学者教程
- python圣诞节_圣诞节,用Python给自己加顶“圣诞帽”
- 大班音乐机器人反思_幼儿园大班音乐游戏教案活动《机器人》含反思
- Sara 老友记 第一季第六集 Joey天天演烂片
- ffmpeg实例,fade淡入淡出效果
- Tracup|10个有效的工作习惯,成功的例子和技巧
- 夹治具设计需要遵循的一些设计准则:
- Remote NDIS (RNDIS)
热门文章
- 你需要的git命令大全来了
- 深入剖析Redis系列(四) - Redis数据结构与全局命令概述
- 机房管理系列之杀毒服务器维护
- ORA-01400: 无法将 NULL 插入 (CHARGE_WQRL.SF_JMQTFY_T.BH)
- Android简明开发教程二十一:访问Internet 绘制在线地图
- 利用正则表达式截取特定字符中间字符
- 丁洪波 -- 不要“ 总是拿着微不足道的成就来骗自己”
- 4. ZooKeeper 基本操作
- List集合的remove一个对象的方法
- 用UIpickView实现省市的联动