├── .gitignore ├── src ├── a.jpg └── main.js ├── index.html ├── .babelrc ├── webpack.config.js ├── .eslintrc.js ├── package.json └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ -------------------------------------------------------------------------------- /src/a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seehuang/webpack-react-cli/HEAD/src/a.jpg -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

11111

9 |
10 | 11 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "es2015", 5 | { "modules": false } 6 | ], 7 | "react" 8 | ], 9 | "plugins": ["react-hot-loader/babel"] 10 | } 11 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: hc 3 | * @Date: 2018-03-28 09:00:53 4 | * @Last Modified by: hc 5 | * @Last Modified time: 2018-03-28 09:01:25 6 | */ 7 | //获取环境命令,并除去首位空格 8 | const env = process.env.NODE_ENV.replace(/(\s*$)|(^\s*)/ig,""); 9 | 10 | //根据环境变量引用的相关的配置文件 11 | module.exports = require(`./build/webpack.conf.${env}.js`) -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: hc 3 | * @Date: 2018-03-27 18:32:47 4 | * @Last Modified by: hc 5 | * @Last Modified time: 2018-03-29 12:20:51 6 | */ 7 | import React,{Component} from 'react' 8 | import ReactDOM from 'react-dom' 9 | import imgA from './a.jpg' 10 | class App extends React.Component { 11 | render(){ 12 | return ( 13 |
14 |
1111112223ff31111111 15 | 16 |
17 |
18 | ) 19 | } 20 | } 21 | ReactDOM.render(,document.getElementById('app')); -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: hc 3 | * @Date: 2018-02-11 10:31:08 4 | * @Last Modified by: hc 5 | * @Last Modified time: 2018-03-29 12:19:46 6 | */ 7 | module.exports = { 8 | root:true, 9 | env: { 10 | browser:true, 11 | commonjs:true, 12 | es6:true, 13 | node:true 14 | }, 15 | // extends:'eslint:recommended', 16 | plugins:['html'], 17 | parserOptions:{ 18 | "sourceType":'module', 19 | "ecmaFeatures": { 20 | "jsx": true 21 | } 22 | }, 23 | rules:{ 24 | //'comma-dangle':['error','always-multiline'], 25 | //indent:['error',2], 26 | quotes:['error','single'], 27 | // 'no-unused-wars':['warn'], 28 | // 'no-console':0 29 | } 30 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webpack-react-cli", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "set NODE_ENV=dev && webpack-dev-server --open", 8 | "build": "set NODE_ENV=prod && webpack", 9 | "lint": "set NODE_ENV=lint && webpack" 10 | }, 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "babel-polyfill": "^6.26.0", 15 | "react": "^16.2.0", 16 | "react-dom": "^16.2.0", 17 | "react-router-dom": "^4.2.2" 18 | }, 19 | "devDependencies": { 20 | "babel-cli": "^6.26.0", 21 | "babel-core": "^6.26.0", 22 | "babel-loader": "^7.1.2", 23 | "babel-preset-es2015": "^6.24.1", 24 | "babel-preset-react": "^6.24.1", 25 | "clean-webpack-plugin": "^0.1.17", 26 | "css-loader": "^0.28.7", 27 | "eslint": "^4.19.1", 28 | "eslint-friendly-formatter": "^4.0.0", 29 | "eslint-loader": "^2.0.0", 30 | "eslint-plugin-html": "^4.0.2", 31 | "eslint-plugin-node": "^6.0.1", 32 | "file-loader": "^1.1.6", 33 | "html-webpack-plugin": "^2.30.1", 34 | "node-sass": "^4.7.2", 35 | "react-hot-loader": "^3.1.3", 36 | "sass-loader": "^6.0.6", 37 | "style-loader": "^0.19.1", 38 | "uglifyjs-webpack-plugin": "^1.1.5", 39 | "webpack": "^3.10.0", 40 | "webpack-dev-server": "^2.11.1", 41 | "webpack-merge": "^4.1.1" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # webpack-react-cli 2 | 3 | 4 | 构建一个react单页应用脚手架 5 | 6 | 7 | ## 前言 8 | 9 | > react官方出了一个脚手架,create-react-app,这个脚手架受到了广泛的好评与使用,脚手架集成了代码打包编译、热更新、ESLint检查等常用功能,基本适用大部分的中小型项目,但是该脚手架也有缺点,所有的配置项已经封装成一个npm包,要做出自定义配置比较麻烦,比如加个sass预处理,或者再配置一个代码环境等,此类个性需求就要去改动脚手架,很不方便。所以,打算自己配置一个react单页应用脚手架,所有的配置文件集中在项目表层上,便于修改和定制打包方案。 10 | 11 | 12 | ## 构建目标 13 | 14 | - [x] eslint代码检查 15 | - [x] ES6代码编译 16 | - [x] js模块打包,公共,业务代码分开打包,并加入hash 17 | - [x] 提取html模板文件,并自动添加css,js 18 | - [x] 提取图片文件,压缩图片 19 | - [x] 提取字体文件 20 | - [x] 开启本地服务调试 21 | - [x] 加入第三方非模块化库或者插件(如jquery,swiper) 22 | - [x] 开启本地server 23 | - [x] 使用source map调试 24 | 25 | ## 项目结构 26 | 27 |
28 | │  .babelrc
29 | │  .eslintrc.js
30 | │  .gitignore
31 | │  index.html
32 | │  package.json
33 | │  README.md
34 | │  webpack.config.js
35 | │
36 | ├─build //webpack构建配置
37 | │      webpack.conf.base.js
38 | │      webpack.conf.dev.js
39 | │      webpack.conf.lint.js
40 | │      webpack.conf.prod.js
41 | │
42 | └─src  //项目源码
43 |         a.jpg
44 |         main.js
45 |  
46 | 47 | 48 | 49 | ## 运行项目 50 | 51 |
52 | npm run dev 开发环境,启用服务,浏览器输入localhost:8080/index.html
53 | npm run build 生产环境,项目被打包到dist文件夹
54 | npm run lint 启用eslint检测代码
55 | 
56 | 57 | ## 项目依赖 58 |
59 | 1.安装 webpack 和 webpack-dev-server
60 | npm install webpack webpack-dev-server --save-dev
61 | 
62 | 2.安装 webpack-merge
63 | npm install webpack-merge --save-dev
64 | 该插件用来对 webpack 配置进行合并操作。
65 | 
66 | 3.安装 babel 相关插件
67 | npm install babel-core babel-loader babel-preset-env babel-plugin-transform-es2015-spread --save-dev
68 | 这系列插件用来对 ES6 语法进行转换。
69 | 
70 | 4.安装样式处理相关插件
71 | npm install css-loader style-loader postcss-loader autoprefixer --save-dev
72 | 这系列插件用来处理 CSS 样式,其中 autoprefixer 是 postcss 的一个插件,用来自动给 CSS 样式添加前缀。
73 | 
74 | 5.安装 file-loader
75 | npm install file-loader --save-dev
76 | 该插件将在导入图片、字体等文件时发挥作用,主要是针对css中的url。
77 | 
78 | 6.安装 ESLint 相关的插件
79 | npm install eslint eslint-loader --save-dev
80 | 这些插件用来对 JavaScript 代码进行检查。
81 | 
82 | 7.安装 html-webpack-plugin 插件
83 | npm install html-webpack-plugin --save-dev
84 | 该插件用来自动生成 HTML 文件。
85 | 
86 | 8.安装 extract-text-webpack-plugin 插件
87 | npm install extract-text-webpack-plugin --save-dev
88 | 该插件用来将 CSS 抽取到独立的文件。
89 | 
90 | 9.安装 clean-webpack-plugin 插件
91 | npm install clean-webpack-plugin --save-dev
92 | 该插件用来对 dist 文件夹进行清理工作,每次打包时先清理之前的 dist 文件夹。
93 | 
94 | 95 | 96 | 97 | 98 | 99 | --------------------------------------------------------------------------------