前言
前面提到前端大统一的概念,如果感兴趣,欢迎说说自己的看法,点击前往。Web前端框架层出不穷,不可能面面俱到,这里给个小建议:
- 如果对Weex App感兴趣,应该选择vue框架;
- 如果对React Native App感兴趣,应该选择React.js框架;
本系列文章是React技术栈,Vue技术栈将会在本系列文章结束后陆续更新。
技术栈
由于本系列的文章是项目实战,需要有相关的技术基础,可以到下方给出的链接进行深入学习。项目实战用到的主要框架和插件有:
- webpack:预编译模块打包工具。 官方文档 - 中文翻译
- React:构建用户界面的JavaScript库。 官方文档 - 中文翻译
- Redux:管理整个应用的数据流。 官方文档 - 中文翻译
- react-router:React应用路由库。 官方文档
- styled-components:React中的CSS最佳实践。 官方文档
- isomorphic-fetch:fetch兼容库。 官方文档
- JRoll2:移动前端滑动插件。 官方文档
- ECharts:基于html5 Canvas图表库。 官方文档
建议学习时以官方文档为准,中文翻译或者第三方作者的教程可以帮助你理清思路;会用到的重要知识点我也会进行简明的解释,如遇到错误或者不理解的内容,欢迎实时指出。
环境搭建
环境搭建是最为枯燥和最容易出错的地方,不过作为开发者,我们还是很有必要了解配置的具体步骤,在后面一段时间会发布一个简易版环境搭建教程。
系统环境:Win10 + 关闭安全管家
Node.js安装
到官方网站下载安装包 点击前往,选择LTS版本
(9.0以后的版本在安装styled-components时会报错)。
npm部署
npm更新并部署至全局
npm install npm -g #【可选】设置淘宝镜像 npm config set registry https://registry.npm.taobao.org
npm常用命令:
npm init #引导创建package.json文件 npm install *** #本地安装;会在当前目录生成node_modules文件夹,并在此安装node模块 npm install *** -g #全局安装;会在C:\Users\***\AppData\Roaming\npm\node_modules安装 npm install *** --save #运行时依赖的模块;自动把模块和版本号添加到package.json文件dependencies部分 npm install *** --save-dev #开发时依赖的模块;自动把模块和版本号添加到package.json文件devdependencies部分 npm update *** #更新node模块 npm uninstall *** #卸载node模块
创建package.json文件
项目根目录:D:\web\react-webapp-demo
,请根据自己实际情况设置。
cd D:\web\react-webapp-demo #在PowerSell中打开项目目录 npm init -y #跳过提问阶段,直接生成一个新的 package.json 文件。
安装模块
npm install --save react react-dom redux react-redux redux-logger redux-thunk react-router react-router-redux history styled-components isomorphic-fetch jroll jroll-pulldown jroll-infinite echarts babel-polyfill npm install --save-dev webpack webpack-dev-server webpack-merge clean-webpack-plugin babel-loader babel-core babel-preset-env babel-preset-react css-loader style-loader file-loader url-loader html-webpack-plugin uglifyjs-webpack-plugin
模块简要说明:
react
react-dom
:React依赖redux
react-redux
redux-logger
redux-thunk
:Redux依赖react-router
react-router-redux
history
:react-router依赖styled-components
:React中的CSS的实现依赖isomorphic-fetch
:fetch兼容库jroll
jroll-pulldown
jroll-infinite
:JRoll插件依赖echarts
:基于html5 Canvas图表库babel-polyfill
:用于实现浏览器不支持原生功能的代码webpack
:预编译模块打包webpack-dev-server
:实时重新加载的Web服务器webpack-merge
:webpack配置分离插件clean-webpack-plugin
:在building之前删除你以前build过的文件babel-loader
babel-core
babel-preset-env
babel-preset-react
:转码器babel依赖css-loader
style-loader
file-loader
url-loader
:各格式文件打包依赖html-webpack-plugin
:生成HTML5文件的插件uglifyjs-webpack-plugin
:代码压缩插件
配置模块
在项目根目录生成.babelrc
文件(Windows系统下文件重命名为.babelrc.),并写入如下数据
{ "presets": ["env","react"] }
配置package.json:运行npm run build
启动编译模式和npm run start
热更新模式;
"scripts": { "start": "webpack-dev-server --config webpack.dev.js","build": "webpack --config webpack.prod.js" },
根目录新建webpack配置文件:webpack.common.js
、webpack.dev.js
、webpack.prod.js
;
webpack.common.js(共用配置)
const path = require('path'); const CleanWebpackPlugin = require('clean-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const webpack = require('webpack'); module.exports = { entry: ['babel-polyfill','./src/index.js'],//项目的起点入口 output: { //项目输出配置 path: path.resolve(__dirname,'build'),//文件的输出目录 filename: 'static/js/[name].[hash:5].js' },module: { //模块加载 rules: [ { test: /\.css$/,//匹配规则 use: [ { loader: "style-loader" },{ loader: "css-loader" } ] },{ test: /\.(js|jsx)$/,exclude: /node_modules/,use: { loader: 'babel-loader' } },{ test: /\.(png|svg|jpg|gif)$/,use: { loader: 'url-loader',options: { limit: 8192,//小于8192B的文件转为base64文件 name: 'static/images/[name].[hash:5].[ext]' } } } ] },plugins: [ //插件配置 new CleanWebpackPlugin(['build']),//清空编译输出文件夹 new HtmlWebpackPlugin({ title: 'Cinglong\'s Demo',filename: 'index.html',template: path.resolve(__dirname,'templates','index.html') }),//生成Html5文件 new webpack.optimize.CommonsChunkPlugin({ name: 'commons' }),//共用代码打包 ] };
webpack.dev.js(开发配置)
const merge = require('webpack-merge'); const common = require('./webpack.common.js'); const webpack = require('webpack'); module.exports = merge(common,{ devtool: 'inline-source-map',//代码关联显示方式 devServer: { historyApiFallback:true,//文件重定向,和react-router相关 hot: true,//开启模块热替换 port: 80,//服务器端口 host: "192.168.23.101",//服务器域名 open: true //自动打开浏览器标签 },plugins: [ new webpack.NamedModulesPlugin(),//显示模块的相对路径 new webpack.HotModuleReplacementPlugin() //加载热替换插件 ] });
webpack.prod.js(预编译配置)
const merge = require('webpack-merge'); const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); const common = require('./webpack.common.js'); module.exports = merge(common,{ plugins: [ new UglifyJSPlugin() //代码压缩 ] });
项目目录
react-webapp-demo |- /node_modules //模块安装目录 |- /src //代码目录 |- /components //展示组件 |- /images //图片目录 |- /containers //容器组件 |- /reducers //reducers操作 |- /utils //其他 |- index.js //项目入口 |- /templates //模板目录 |- .babelrc //babel编译配置 |- package.json //项目目录配置 |- package-lock.json //模块信息(自动生成) |- webpack.common.js //webpack共用配置 |- webpack.dev.js //webpack开发配置 |- webpack.prod.js //webpack编译配置
后记
配置好环境,下一章开始登陆流程代码实操。