react-webpack2-完整案例
来源:互联网 发布:centos挂载硬盘分区 编辑:程序博客网 时间:2024/06/16 21:50
react-webpack 2 - 完整配置案例
源码
webpack 开发跨域问题解决
1.先定义一些配置常量 /webpack/config.js
// 引入 node.js path 模块 const path = require('path'); // sass-loader 的 配置 exports.sassLoaderConfig = '?outputStyle=expanded'; // 公共文件 exports.vendor = [ 'react', 'react-dom', 'react-redux', 'react-router', 'react-router-redux', 'redux', 'redux-thunk' ]; // css 代码自动补全配置 exports.autoConfig = { browsers: [ 'ie >= 9', 'ie_mob >= 10', 'ff >= 30', 'chrome >= 34', 'safari >= 7', 'opera >= 23', 'ios >= 7', 'android >= 4.4', 'bb >= 10' ], cascade: true, remove: true }; // js 压缩 配置 exports.uglifyJsConfig = { beautify: false, // 不美化输出 compress: { warnings: false, // 不保留警告 drop_debugger: true, // 不保留调试语句 drop_console: true // 不保留控制台输出信息 }, mangle: { // 跳过这些,不改变命名 except: ['$super', '$', 'exports', 'require'] }, space_colon: false, comments: false // 不保留注释 }; // 定义 文件路径 注:文件在 根目录下的 webpack 文件夹下 const ROOT_PATH = path.resolve(__dirname, '../'); exports.defPath = { ROOT_PATH: ROOT_PATH, APP_PATH: path.resolve(ROOT_PATH, 'app'), DEV_PATH: path.resolve(ROOT_PATH, 'dev'), BUILD_PATH: path.resolve(ROOT_PATH, 'build'), TPL_PATH: path.resolve(ROOT_PATH, 'app/tpl.html'), ENTRY_PATH: path.resolve(ROOT_PATH, 'app/js/index.js'), ESLINT_PATH: path.resolve(ROOT_PATH, './.eslintrc'), REQUEST_PATH: path.resolve(ROOT_PATH, 'app/js/utils/request') }
2.定义不同环境变量下的 应用请求配置
// `npm install ip` 获取本机 ip 用于配置服务器 const ip = require('ip').address(); module.exports = { test: 'http://xxx.xxx', development: 'http://' + ip + ':3003', production: 'http://xxx.xxx' };
定义公共的配置 /webpack/base.js
const webpack = require('webpack'); const autoprefixer = require('autoprefixer'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const config = require('./config'); // 引入配置 const API = require('./API'); const defPath = config.defPath; const APP_PATH = defPath.APP_PATH; // 源码目录 module.exports = function () { return { context: defPath.ROOT_PATH, // 设置跟目录为执行环境 resolve: { // 解析模块请求的选项 modules: [ APP_PATH, 'node_modules' ], // 用于查找模块的目录 extensions: [ '.js', '.json', '.jsx', '.css' ] // 使用的扩展名 }, cache: true, // 启用缓存 module: { // 公用的加载器 rules: [ { enforce: 'pre', // 前置执行 test : /\.(js|jsx)$/, include : APP_PATH, loader : 'eslint-loader', options: { configFile: defPath.ESLINT_PATH // 指定 eslint 的配置文件路径 } }, { test: /\.(js|jsx)$/, include: APP_PATH, loader: 'babel-loader' }, { // 向应用特定文件中注入变量,应用中可以直接使用 baseUrl test: require.resolve(defPath.REQUEST_PATH), loader: 'imports-loader?baseUrl=>'+ JSON.stringify( API[ process.env.NODE_ENV || 'development' ] ) } ] }, plugins: [ // autoprefixer 是 postcss-loader 的 插件,需要在这里进行 autoprefixer 插件的配置 new webpack.LoaderOptionsPlugin({ options: { context: '/', minimize: true, postcss: [autoprefixer(config.autoConfig)] } }), // 依照模板生成 html new HtmlWebpackPlugin({ template: defPath.TPL_PATH, title: 'Hello World app', filename: 'index.html', inject: 'body', minify: { removeComments: true }, cache: false }) ] } }
开发环境的 webpack 配置 /webpack.dev.config.js
const webpackMerge = require('webpack-merge'); const webpack = require('webpack'); const ChunkManifestPlugin = require('chunk-manifest-webpack-plugin'); const ip = require('ip').address(); const baseConfig = require('./webpack/base'); const config = require('./webpack/config'); const defPath = config.defPath; const APP_PATH = defPath.APP_PATH; // 使用 `webpack-merge` 将基础配置和新配置合并 module.exports = webpackMerge(baseConfig(), { devtool: 'cheap-module-source-map', // 增强浏览器调试 entry: { // 入口 app: [ // 热加载配置 'react-hot-loader/patch', 'webpack-dev-server/client?http://' + ip + ':8090', 'webpack/hot/only-dev-server', './app/js/index.js' ], vendor: config.vendor // 公共文件单独打包 }, output: { // 出口 path: defPath.DEV_PATH, // 所有输出文件的目标路径 // 所有输出文件的目标路径 filename: 'js/bundle.js', // 输出文件命名 publicPath: '/', // 必须写,且与 devServer 的 publicPath 保持一致 chunkFilename: '[name].chunk.js' // 分块文件命名 }, module: { rules: [ // 配置加载器 { test: /\.(scss|sass|css)$/, include: APP_PATH, // 必须匹配选项 use: [ // 2.x 版本改为 use 代替 loaders,必须加 -loader 'style-loader', 'css-loader', 'postcss-loader', 'sass-loader' + config.sassLoaderConfig ] }, { test: /\.(eot|woff|woff2|ttf|svg|png|jpe?g|gif|mp4|webm)(\?\S*)?$/, include: APP_PATH, loader: 'url-loader?limit=8192&name=imgs/[name].[ext]' } ] }, plugins: [ // 热模块替换相关插件 new webpack.HotModuleReplacementPlugin(), new webpack.NamedModulesPlugin(), // 定义环境变量 new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify('development') }), /* 公用模块单独打包,对应 入口文件 vendor, 持久化缓存配置 */ new webpack.optimize.CommonsChunkPlugin({ names: [ // 提取公共模块名称 'vendor', 'manifest' // manifest 用于分离 webpack runtime ], filename: 'js/[name].js', // 公共模块文件名 minChunks: Infinity // Infinity 表示仅仅创建公共组件块,不会把任何modules打包进去。 }), new ChunkManifestPlugin({ // 将 manifest 提取到一个单独的 JSON 文件中 filename: 'chunk-manifest.json', manifestVariable: 'webpackManifest' // 全局变量的名称,webpack 将利用它查找 manifest JSON 对象 }) ], devServer: { // 开启服务器 contentBase: defPath.DEV_PATH, publicPath: '/', historyApiFallback: true, clientLogLevel: 'none', host: ip, port: 8090, open: true, hot: true, inline: true, compress: true, stats: { colors: true, errors: true, warnings: true, modules: false, chunks: false } } })
生产环境 webpack 配置 /webpack.prod.config.js
const webpackMerge = require('webpack-merge'); const webpack = require('webpack'); const ChunkManifestPlugin = require('chunk-manifest-webpack-plugin'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const WebpackMd5Hash = require('webpack-md5-hash'); const baseConfig = require('./webpack/base'); const config = require('./webpack/config'); const defPath = config.defPath; const APP_PATH = defPath.APP_PATH; module.exports = webpackMerge(baseConfig(), { entry: { app: defPath.ENTRY_PATH, vendor: config.vendor }, output: { path: defPath.BUILD_PATH, // 所有输出文件的目标路径 filename: 'js/bundle.js?[chunkhash]', publicPath: 'http://xxx.xxx', // 修改成发布的地址 chunkFilename: 'chunk.js?[chunkhash]' }, module: { rules: [ { test: /\.(scss|sass|css)$/, include: APP_PATH, use: ExtractTextPlugin.extract({ // css 单独打包,(2.x 改变很大) fallback: 'style-loader', use: 'css-loader!postcss-loader!sass-loader' + config.sassLoaderConfig }) }, { test: /\.(eot|woff|woff2|ttf|svg|png|jpe?g|gif|mp4|webm)(\?\S*)?$/, include: APP_PATH, loader: 'url-loader?limit=8192&name=imgs/[name].[ext]?[hash]' } ] }, plugins: [ new WebpackMd5Hash(), // 取代标准webpack chunkhash new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify('production') }), // js 压缩 new webpack.optimize.UglifyJsPlugin(config.uglifyJsConfig), new webpack.optimize.CommonsChunkPlugin({ names: [ 'vendor', 'manifest' ], filename: 'js/[name].js?[chunkhash]', minChunks: Infinity }), new ChunkManifestPlugin({ filename: 'chunk-manifest.json', manifestVariable: 'webpackManifest' }), // css 抽取 new ExtractTextPlugin({ filename: 'css/styles.css?[contenthash]', disable: false, allChunks: true }) ] })
对应的 babel 配置 /.babelrc
{ "presets": [ ["es2015", { "modules": false }], "stage-2", "react" ], "plugins": [ "react-hot-loader/babel", "transform-object-assign", "transform-decorators-legacy" ], "env": { "development": { "plugins": [ "react-hot-loader/babel" ] } } }
重要插件版本列表
{ "webpack": "^2.2.1", "webpack-dev-server": "^2.4.1", "webpack-md5-hash": "0.0.5", "webpack-merge": "^4.0.0", "chunk-manifest-webpack-plugin": "^1.0.0", "extract-text-webpack-plugin": "^2.1.0", "html-webpack-plugin": "^2.28.0", "react-hot-loader": "^3.0.0-beta.6",}
0 1
- react-webpack2-完整案例
- React+react-router4+webpack2基础环境搭建
- react-webpack2-热模块替换[HMR]
- webpack2.0搭建react框架环境
- Webpack2 完整踩坑教程(一)
- Webpack2 完整踩坑教程(二)
- Webpack2 完整踩坑教程(三)
- Webpack2 完整踩坑教程(四)
- Webpack2 完整踩坑教程(五)
- Webpack2 完整踩坑教程(六)
- Webpack2 完整踩坑教程(七)
- Webpack2 完整踩坑教程(八)
- Webpack2 完整踩坑教程(九)
- Webpack2 完整踩坑教程(十)
- Webpack2 完整踩坑教程(十一)
- Webpack2 完整踩坑教程(十二)
- Webpack2 完整踩坑教程(十三)
- Webpack2 完整踩坑教程(十四)
- resin的配置(如何通过浏览器访问发布到resin服务器的html文件)
- 算法-归并排序(Merge-Sort)
- Ubuntu下编译ffmpeg、SDL、SDL_net库
- android stdio常用快捷键
- jdbcType与javaType的对应关系
- react-webpack2-完整案例
- 第八,九章
- E-charts之一个与页面多个图表并且自适应的方案
- Git
- Linux下命令行安装配置android sdk
- 常规双击回退键退出程序
- I/O复用(三)---epoll机制
- java连接ubuntu中的redis出错
- C++——math.h