webpack3+React 的配置全解


Posted in Javascript onAugust 21, 2017

webpack3 的配置相对于webpack2 又有了一些新的变化,这里讲其记录下来,备查 。

package.json 的完整文件在结尾 。

1. 安装

npm init
yarn add webpack webpack-dev-server -D

2. 配置简单输入输出

webpack.config.js

module.exports = {
 entry: {
  ventor: ['react', 'react-dom'],
  index: [
   'babel-polyfill',
   'react-hot-loader/patch',
   path.resolve(__dirname, "src/index.js")
  ]
 },
 output: {
  path: path.resolve(__dirname, "dist"),
  filename: "js/[name].js",
 },
 devtool: 'source-map'

将所用到的库单独分离出来,在多页面应用中,对减少文件体积很有用 。

react-hot-loader 的3.0 版本的get start 刚刚更新 。 单独打包了补丁,所以react-hot-loader 作为一个生产依赖安装 。

这样基本的输入输出就完成了 。

3. webpack-dev-server

devServer: {
  hot: true, // 热重载
  inline: true, // 启用inline 模式
  port: 46480,
  contentBase: path.resolve(__dirname, "dist"),
  proxy: {
   "/api": {
     target: "xxxxx",
     secure: false, // 处理https
     changeOrigin: true,  // 跨域
   }
  }
 },

4. loaders

webpack 将所有的文件都当做js文件处理,所以配置加载器

4.1 安装loader

yarn add babel-loader less-loader postcss-loader css-loader style-loader -D
yarn add react-hot-loader

4.2 配置loader

注意,loader 中的 name 都是相对于 output中的path 的 。

postcss-loader是对css 文件做一些预处理,常用就是添加css3属性前缀,用到 autoprefixer 插件 。 配置postcss-loader ,需要 postcss.config.js 文件 。

babel-loader 需要配置option选项,这里单独提出去,放置到.babelrc 文件中 。

webpack.config.js

module: {
  rules: [{
    test: /.js$/,
    use: [
     "react-hot-loader/webpack",
     "babel-loader",
    ],
    exclude: path.resolve(__dirname, "node_modules")
   },
   {
    test: /\.css$/,
    use: [
     "style-loader",
     "css-loader",
     "postcss-loader"
    ]
   },
   {
    test: /\.less$/,
    use: [
     "style-loader",
     "css-loader",
     "postcss-loader",
     "less-loader"
    ]
   },
   {
    test: /\.(gif|png|jpe?g)$/,
    use: [{
     loader: "file-loader",
     options: {
      name: "static/img/[name].[ext]"
     }
    }]
   },
   {
    test: /\.(ttf|eot|svg|woff)(\?(\w|#)*)?$/,
    use: [{
     loader: "file-loader",
     options: {
      name: "static/font/[name].[ext]"
     }
    }]
   }
  ]
 },

.babelrc

{
 "presets": ["es2015", "stage-0", "react"],
 "plugins": ["transform-decorators-legacy"]
}

transform-decorators-legacy 这个插件用来转化es7 中的装饰器,比如 autobind,connect 等 。

postcss.config.js

module.exports = {
  plugins: [
    require('autoprefixer')
  ]
}

5. 插件

插件是webpack 中非常重要的一部分 。

5.1 HtmlWebpackPlugin 插件 。

自动生成html文件,并自动引入script文件 。有几个页面就要new 几个插件, 自动引入同名的js文件。

const HtmlWebpackPlugin = require("html-webpack-plugin");
new HtmlWebpackPlugin({
 template: path.resolve(__dirname, "src/index.html"),
 name: "index",
 title: "webpack config cli",
 filename: "index.html",
 inject: true,
}),

5.2 CommonsChunkPlugin 插件将单独的部分作为chunk 提出去,减小文件体积,这里的name 要和 entry中对应 。

new webpack.optimize.CommonsChunkPlugin({
 name: 'vendor',
 filename: 'js/vendor.js'
}),

5.3 webpack 模块热替换插件 HotModuleReplacementPlugin

new webpack.HotModuleReplacementPlugin()

5.4 ExtractTextPlugin 分离css 文件

在这个插件加载以前,css 文件是放在js文件中,在解释js时,将文本插入到style节点中 。

使用这个插件以后,就直接可以单独分离css 文件 。

但是在开发环境中不要使用,会影响热重载的速度。

ExtractTextPlugin 的插件配置相对复杂 。首先包裹loaders,注意这里已经不能再使用style-loader了,因为提取css的任务插件完成了 。当提取失败时,使用style-loader 。

const ExtractTextPlugin = require("extract-text-webpack-plugin");
 // loader部分
   {
    test: /\.css$/,
    use: ExtractTextPlugin.extract({
     fallback: "style-loader",
     use: [
      "css-loader",
      "postcss-loader"
     ]
    })
   },
   {
    test: /\.less$/,
    use: ExtractTextPlugin.extract({
     fallback: "style-loader",
     use: [
      "css-loader",
      "postcss-loader",
      "less-loader"
     ]
    })
   }
 // 插件部分
  new ExtractTextPlugin({
   filename: "css/index.css"
  }),

6. 其他

extensions:用于省略后缀名

alias 处理别名 。

resolve: {
  extensions: [" ", ".js", ".jsx", ".css", ".less"],
  alias: {
   components: path.resolve(__dirname, 'src/components/'),
   css: path.resolve(__dirname, "src/css/"),
   model: path.resolve(__dirname, 'src/model/'),
   store: path.resolve(__dirname, 'src/store/')
  }
 }

7.package.json

{
 "name": "webpack-react-cli",
 "version": "1.0.0",
 "description": "",
 "main": "webpack.config.js",
 "scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
  "dev": "webpack-dev-server --open",
  "build": "webpack -w"
 },
 "author": "",
 "license": "ISC",
 "devDependencies": {
  "autoprefixer": "^7.1.2",
  "babel-core": "^6.25.0",
  "babel-loader": "^7.1.1",
  "babel-plugin-transform-decorators-legacy": "^1.3.4",
  "babel-preset-es2015": "^6.24.1",
  "babel-preset-react": "^6.24.1",
  "babel-preset-stage-0": "^6.24.1",
  "css-loader": "^0.28.4",
  "extract-text-webpack-plugin": "^3.0.0",
  "file-loader": "^0.11.2",
  "html-webpack-plugin": "^2.30.1",
  "less": "^2.7.2",
  "less-loader": "^4.0.5",
  "postcss-loader": "^2.0.6",
  "style-loader": "^0.18.2",
  "webpack": "^3.0.0",
  "webpack-dev-server": "^2.5.0"
 },
 "dependencies": {
  "babel-polyfill": "^6.23.0",
  "core-decorators": "^0.19.0",
  "prop-types": "^15.5.10",
  "react": "^15.6.1",
  "react-dom": "^15.6.1",
  "react-hot-loader": "^3.0.0-beta.7"
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js查找父节点的简单方法
Jun 28 Javascript
jquery 操作DOM的基本用法分享
Apr 05 Javascript
javascript编写贪吃蛇游戏
Jul 07 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
Sep 01 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
Jul 01 Javascript
详解JavaScript模块化开发
Dec 04 Javascript
原生js编写基于面向对象的分页组件
Dec 05 Javascript
JavaScript实现短暂提示框功能
Apr 04 Javascript
Vue Router的懒加载路径的解决方法
Jun 21 Javascript
微信小程序实现星级评价效果
Dec 28 Javascript
layui中select,radio设置不生效的解决方法
Sep 05 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 Javascript
详解Vue微信公众号开发踩坑全记录
Aug 21 #Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
Aug 21 #Javascript
Vue编写多地区选择组件
Aug 21 #Javascript
使用vue制作FullPage页面滚动效果
Aug 21 #Javascript
详解Layer弹出层样式
Aug 21 #Javascript
JS数组操作之增删改查的简单实现
Aug 21 #Javascript
JS实现评价的星星功能
Aug 20 #Javascript
You might like
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
PHP与Java进行通信的实现方法
2013/10/21 PHP
php生成短网址示例
2014/05/05 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
Yii2中datetime类的使用
2016/12/17 PHP
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
2017/10/16 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
python fabric实现远程操作和部署示例
2014/03/25 Python
Python3生成手写体数字方法
2018/01/30 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
New delete 与malloc free 的联系与区别
2013/02/04 面试题
长安大学毕业生自我鉴定
2014/01/17 职场文书
体现团队精神的口号
2014/06/06 职场文书
法人单位适用的授权委托书
2014/09/19 职场文书
2015年度村委会工作总结
2015/04/29 职场文书
导游词之山东八大关
2019/12/18 职场文书