├── .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 |
--------------------------------------------------------------------------------