[关闭]
@1234567890 2017-05-22T13:29:17.000000Z 字数 7237 阅读 1529

react + webpack + ant开发准备

react


开发目录

  1. ├── src #开发目录
  2. | ├──assets #存放静态资源
  3. | | ├──datas #存放数据 json 文件
  4. | | ├──images #存放图片资源文件
  5. | | └──styles #存放全局css变量文件和reset文件
  6. | ├──lib
  7. | | ├──components #存放数据 模块组件 文件
  8. | | | └──Header
  9. | | | ├──Header.js
  10. | | | └──Header.css
  11. | | |
  12. | | └──utils #存放utils工具函数文件
  13. | |
  14. | └──views
  15. | ├──Index #入口文件
  16. | | ├──Index.html #html文件
  17. | | ├──Index.js
  18. | | └──Index.css
  19. | └──Index2
  20. ├── dist #发布目录
  21. ├── node_modules #包文件夹
  22. ├── .gitignore
  23. ├── .balbelrc
  24. ├── webpack.config.js #webpack配置文件
  25. └── package.json

准备组件

安装react/antd

  1. npm install react react-dom antd --save

安装webpack

  1. npm install webpack less webpack-dev-server --save-dev

安装babel-loader以及其他相关package

  1. npm install babel-loader babel-core babel-preset-es2015 babel-preset-react babel-preset-stage-1 --save-dev

安装style-loader/css-loader等

  1. npm install style-loader css-loader less-loader url-loader file-loader --save-dev

安装插件

  1. npm install path fs extract-text-webpack-plugin@^2.0.0-rc.3 html-webpack-plugin --save-dev

配置webpack.config.js

  1. //分离css
  2. let ExtractTextPlugin = require("extract-text-webpack-plugin");
  3. //模版
  4. var HtmlWebpackPlugin = require('html-webpack-plugin');
  5. let path = require('path');
  6. let webpack = require('webpack');
  7. let fs = require('fs');
  8. //输出路径
  9. let outputDir = path.resolve(__dirname, './dist');
  10. //入口
  11. let entryPath = './src/views';
  12. //多文件入口
  13. let entris = fs.readdirSync(entryPath).reduce(function (o, filename) {
  14. !/\./.test(filename) &&
  15. (o[filename] = './' + path.join(entryPath, filename, filename + '.js'));
  16. return o;
  17. }, {}
  18. );
  19. module.exports={
  20. entry:entris,
  21. output: {
  22. path: outputDir,
  23. filename: 'js/[name].bundle.js',
  24. publicPath: '/dist/'
  25. },
  26. //源码调试
  27. devtool:'source-map',
  28. module:{
  29. loaders:[
  30. {test: /\.css$/,loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader'})},
  31. {test: /\.less$/,loader: 'style-loader!css-loader!less-loader'},
  32. {test:/\.js$/,loader:'react-hot-loader!babel-loader',exclude:/node_modules/},
  33. {
  34. test: /\.(png|jpg|gif|woff|svg|eot|ttf|woff2)$/,
  35. loader: 'url-loader?limit=10240&name=images/[name]-[hash:8].[ext]!image-webpack-loader',
  36. }
  37. ]
  38. },
  39. plugins: [
  40. new ExtractTextPlugin("css/[name].bundle.css"),
  41. new webpack.optimize.CommonsChunkPlugin({
  42. name: "commons",
  43. filename: "js/commons.bundle.js"
  44. }),
  45. new HtmlWebpackPlugin({
  46. inject: 'body',
  47. filename: '../cart.htm',
  48. template: 'template.html',
  49. chunks: ['Loading']
  50. })
  51. ]
  52. }

coding地址
学习参考

Webpack配置示例和详细说明

  1. /*
  2. * 请使用最新版本nodejs
  3. * 默认配置,是按生产环境的要求设置,也就是使用 webpack -p 命令就可以生成正式上线版本。
  4. * 也可以使用 webpack -d -w 命令,生成用于开发调试的代码。
  5. * 通常开发使用 node server.dev.js 命令 , server.dev.js基于此配置做了特殊处理,
  6. 主要是为了自动刷新和热更新, 这个服务只是在内存中生成缓存文件,不会在硬盘中生成文件。
  7. * webpack配置,如果出现问题,通常都是路径问题造成的
  8. *
  9. * 常用命令看package.json中配置的scripts,比如
  10. * "scripts": {
  11. * "d": "node server.dev.js",
  12. * "reset:dist": "rm -fr dist && mkdir -p dist/build && cp -r src/lib dist",
  13. * "p": "npm run reset:dist &&
  14. ./node_modules/.bin/webpack -p --display-error-details --progress --colors"
  15. * }
  16. */
  17. //导入Node.js的path模块,主要用来转换成绝对路径,比如path.resolve(__dirname, 'build')
  18. const path = require('path');
  19. //导入webpack整个模块
  20. //也可以不导入webpack整个模块,而值导入用到的内置插件模块
  21. //比如 var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin")
  22. //这样后面使用方式为 new CommonsChunkPlugin
  23. //否则为new webpack.optimize.CommonsChunkPlugin
  24. const webpack = require('webpack');
  25. //导入ExtractTextPlugin插件,作用提取代码中的css生成独立的CSS文件
  26. const ExtractTextPlugin = require('extract-text-webpack-plugin');
  27. //导入HtmlWebpackPlugin插件,作用按需求生成html页面,想用好,挺麻烦的,可以不用
  28. const HtmlWebpackPlugin = require('html-webpack-plugin');
  29. //打包配置 webpack配置,多数同时支持String, Array or Object的写法。
  30. 单字符串的形式用于简单情况,key-value对象的形式用于复杂情况。
  31. const config = {
  32. // 入口文件配置,打包输出的来源
  33. // 多种写法
  34. entry:'entry.js'
  35. entry:{entry1:'entry1.js'}
  36. entry:{entry1:['entry1a.js', ...]}
  37. etc.
  38. // 通常用path.resolve(__dirname, 'src/entry.js')转换成绝对路径,
  39. 也可以使用相对路径,比如 './src/entry.js'
  40. entry: {
  41. index: [path.resolve(__dirname, 'src/index.js')],
  42. edit: [path.resolve(__dirname, 'src/edit.js')]
  43. },
  44. //输出配置
  45. //path 输出目录 通常用path.resolve(__dirname, 'build')转换成绝对路径,
  46. 也可以使用相对路径,比如 './build'
  47. //publicPath 开发代码中url的转换拼接处理,通常是代码中各种资源的地址,
  48. 比如图片等, url目录前缀或完整网址url前缀'http://cdn.com/'
  49. //filename 输出js文件名,[name]对应entry对象键名,
  50. 也可以指定名字,加上idhash可以避免缓存问题,
  51. webpack会用实际值替换类似[hash]这样字符串
  52. output: {
  53. path: path.resolve(__dirname, 'dist/build'),
  54. publicPath: './build/',
  55. filename: '[name].[id].[hash].js',
  56. },
  57. //路径解析配置
  58. resolve: {
  59. //自行补全路径中文件的后缀, 第一个是空字符串,对应不需要后缀的情况
  60. extensions: ['', '.webpack.js', '.web.js', '.js', '.jsx']
  61. },
  62. //模块
  63. module: {
  64. //loaders: 加载器
  65. // [
  66. // {
  67. // test:正则表达式,匹配的文件名则使用这个加载器。
  68. // include: 匹配的目录则进一步处理
  69. // exclude: 匹配的目录则排除
  70. // loader: `!`用于分隔loader 字符串形式,作用和数组形式一样
  71. // loaders: ['loader',...] 数组形式,作用和字符串形式一样
  72. // }
  73. // ]
  74. //
  75. // 如果同一文件需要多个loaders处理,
  76. 也就是使用loaders: ['loader',...] 数组形式,
  77. loader的参数不能使用query:{}写法了。只能用拼接字符串写法。
  78. loaders: [
  79. {
  80. //加载css资源,默认写法loader:'style-loader!css-loader'
  81. cssInternal内部形式
  82. //ExtractTextPlugin插件写法用于生成独立的css文件,
  83. 用于external link形式
  84. //生成的独立CSS文件中的url图片地址的publicPath,
  85. 通常JS中的publicPath不一样,如果一样可以不设置
  86. test: /\.css$/,
  87. loader: ExtractTextPlugin.extract(
  88. 'style-loader',
  89. 'css-loader',
  90. {
  91. publicPath: "./"
  92. }
  93. )
  94. },
  95. {
  96. //url-loader处理图片URL,
  97. 如果图片小于limit值直接生成`base64` 格式的`dataUrl`,
  98. 否则输出图片,name参数指定输出目录和图片名
  99. //url-loader依赖file-loader
  100. //image-webpack-loader是用来压缩图片的,主要是透明PNG
  101. test: /\.(jpe?g|png|gif|svg)$/i,
  102. loaders: [
  103. 'url-loader?limit=8192&name=img/[name].[hash].[ext]',
  104. 'image-webpack-loader?{
  105. progressive:true,
  106. optimizationLevel: 7,
  107. interlaced: false,
  108. pngquant:{
  109. quality: "65-90",
  110. speed: 4
  111. }
  112. }'
  113. ]
  114. },
  115. {
  116. //用babel转码器加载有es2015和jsx语法的js,输出为es5语法的js,
  117. 注意这里只是语法转码。
  118. //如果开发代码中有用到新ES规范中的新对象
  119. 或属性方法还需要babel-polyfill
  120. 才能转码成ES5代码
  121. //class-properties和object-rest-spread,是转码类属性写法和非数组对象
  122. 的延展符...,新React常用到的写法,但还不是ES2015规范
  123. //query对象和.babelrc配置文件内容一致,必须都写,
  124. 不然使用webpackbabel-loader会报错.
  125. test: /\.jsx?$/,
  126. exclude: /(node_modules|lib)/,
  127. loader: 'babel-loader',
  128. query: {
  129. presets: ['es2015', 'react'],
  130. plugins: [
  131. 'transform-class-properties',
  132. 'transform-object-rest-spread'
  133. ]
  134. }
  135. }
  136. ]
  137. },
  138. //script引入js类库,通过require或import的方式来使用,
  139. 却不希望webpack把它编译到输出文件中。
  140. //比如不想这么用 const $ = window.jQuery
  141. 而是这么用 const $ = require("jquery") or import $ from "jquery";
  142. 则配置"jquery": "jQuery"
  143. //键名是require或from时的字符串,键值是js内的全局变量名
  144. externals: {
  145. 'react': 'React',
  146. 'react-dom': 'ReactDOM',
  147. 'baidu-hmt': 'window._hmt',
  148. 'lrz': 'lrz',
  149. 'iscroll': 'IScroll',
  150. 'zepto': 'Zepto',
  151. 'fabric': 'fabric',
  152. 'react-slick': 'Slider'
  153. },
  154. plugins: [
  155. //输出独立的css文件,用于external link形式,
  156. 如果有多个入口JS共用的CSS,会生成commons.css
  157. new ExtractTextPlugin('[name].[id].[hash].css'),
  158. //把entry中配置的多个js中共用代码提取生成为单个js,
  159. 多参数写法 new webpack.optimize.CommonsChunkPlugin("commons", "commons.js")
  160. new webpack.optimize.CommonsChunkPlugin({
  161. name: "commons",
  162. filename: "commons.[id].[hash].js"
  163. }),
  164. //按需求生成HTML页面
  165. //template 模板位置
  166. //inject: 'body' js插入在body元素内部的最后
  167. //chunks 对应入口文件名
  168. //filename 生成的文件名,可以带上路径
  169. //options参数对象的值可以自定义,比如这里的libJS
  170. //在模板页中可以获得和使用这些数据,
  171. 可以在模板页中使用<%= JSON.stringify(htmlWebpackPlugin) %>;
  172. 输出查看所有可用的数据
  173. new HtmlWebpackPlugin({
  174. template: 'src/template.html',
  175. inject: 'body',
  176. chunks: ['commons', 'index'],
  177. filename: '../index.html',
  178. title: '最美奥运脸',
  179. libJS: [
  180. //上拉下拉
  181. './lib/js/iscroll-lite.min.js'
  182. ]
  183. }),
  184. new HtmlWebpackPlugin({
  185. template: 'src/template.html',
  186. inject: 'body',
  187. chunks: ['commons', 'edit'],
  188. filename: '../edit.html',
  189. title: '最美奥运脸',
  190. libJS: [
  191. //切换左右拖动
  192. './lib/js/react-slick.min.js',
  193. //编辑图片
  194. './lib/js/fabric.min.js'
  195. ]
  196. })
  197. //ProvidePlugin的作用就是在开发代码内不需要require('react')
  198. import ... from ... 也能使用React
  199. // ,new webpack.ProvidePlugin({
  200. // React: 'react',
  201. // ReactDOM: 'react-dom'
  202. // })
  203. //压缩代码,命令行的 webpack -p 会默认使用这个插件压缩代码
  204. // ,new webpack.optimize.UglifyJsPlugin({
  205. // compress: {
  206. // warnings: false
  207. // }
  208. // })
  209. ]
  210. //webpack-dev-server的配置, 通常弄成独立的文件,比如server.js,
  211. //或者使用命令行形式,比如npm scripts命令行形式,
  212. 类似webpack-dev-server -d --inline --hot
  213. //弄webpack-dev-server通常是为了自动刷新和热更新,配置麻烦
  214. // devServer: {
  215. // contentBase: './',
  216. // host: 'h5.baofeng.com',
  217. // port: 9090, //默认8080
  218. // inline: true //监控文件变化,自动重加载整个页面
  219. // }
  220. };
  221. // babel-polyfill用来转换ES2015新的对象和方法,在入口数组中,
  222. babel-polyfill必须在入口文件字符串前面,
  223. 并且必须在入口文件代码的第一行importrequire 'babel-polyfill'
  224. for (let prop in config.entry) {
  225. config.entry[prop].unshift(
  226. 'babel-polyfill'
  227. );
  228. }
  229. module.exports = config;
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注