开发环境配置

在开发环境下,我们首先考虑的是方便开发,方便代码调试,不需要考虑代码合并和css样式分离这些。

这里主要说三个 :1.css模块化;2.模块热替换功能;3.source-map(代码映射)

  1. // 开发环境打包配置
  2. const path = require('path');
  3. const webpack = require('webpack');
  4. const base = require('./webpack.config.base')
  5. const dfPath = require('./path')
  6. // webpack配置合并工具
  7. const merge =require('webpack-merge')
  8. const RS = (...arg)=>path.resolve( __dirname , ...arg )
  9. // 合并方式配置
  10. let strategyMerge = merge.strategy({
  11. entry: 'prepend'
  12. });
  13. let config = {
  14. entry: {
  15. app: path.resolve(dfPath.root,'src/app.js')
  16. },
  17. output: {
  18. path: dfPath.dist,
  19. filename: '[name].bundle.js',
  20. publicPath: '/',
  21. chunkFilename: '[name].sepChunk.js'
  22. },
  23. module:{
  24. rules: [
  25. {
  26. test: /\.js$/,
  27. use:['babel-loader'],
  28. exclude: [
  29. dfPath.node_modules
  30. ]
  31. },
  32. {
  33. test:/\.css$/,
  34. use:[
  35. 'style-loader',
  36. {
  37. loader:'css-loader',
  38. options:{
  39. // css模块化,方便多人开发
  40. module:true,
  41. // 定义模块化css后的类名(默认为hash值,可读性差)path:路劲; name:文件名; local:本地定义的className
  42. localIdentName: '[path][name]__[local]--[hash:base64:5]'
  43. },
  44. }
  45. ],
  46. // 排除的文件,遇到这些文件不会用当前 loader 处理,也就不会模块化
  47. exclude:[
  48. RS('./src/common'),
  49. RS('node_modules')
  50. ]
  51. },
  52. {
  53. test:/\.css$/,
  54. use:['style-loader','css-loader'],
  55. include:[
  56. RS('./src/common'),
  57. RS('node_modules')
  58. ]
  59. },
  60. {
  61. test: /\.(png|jpg|jpeg|gif)$/,
  62. use: ['url-loader?limit=8192'],
  63. }
  64. ]
  65. },
  66. plugins:[
  67. // 模块热替换功能
  68. new webpack.HotModuleReplacementPlugin()
  69. ],
  70. // 代码映射,方便报错时,找到对应的源代码
  71. devtool: 'cheap-module-eval-source-map',
  72. devServer:{
  73. // 服务器打包后,输出的资源路劲
  74. publicPath:'/',
  75. open:true
  76. }
  77. };
  78. // 导出合并后的webpack配置
  79. module.exports = strategyMerge( base , config );

生产环境

相比开发环境,生产环境打包是要最后发布到服务器部署的代码,我们需要尽量保持代码简洁,加载性能最优,不需要调试辅助工具。

我们从这几个方面优化 :1.公共模块拆分,单独打包;2. css文件分离,单独打包输出;3.代码压缩;

  1. // 生产环境配置
  2. const webpack = require('webpack');
  3. const base = require('./webpack.config.base')
  4. const path = require('path');
  5. const dfPath = require('./path');
  6. const merge = require('webpack-merge');
  7. // 压缩工具
  8. const ClosureCompilerPlugin = require('webpack-closure-compiler');
  9. // css单独打包插件
  10. const extractTextWebpackPlugin = require('extract-text-webpack-plugin');
  11. const extractCSS = new extractTextWebpackPlugin('assets/css/[name]_[contenthash:6].css');
  12. // weback合并配置
  13. let strategyMerge = merge.strategy({
  14. entry: 'replace',
  15. output: 'replace',
  16. module:{
  17. rules: 'replace'
  18. }
  19. });
  20. let config ={
  21. entry: {
  22. // 公共模块拆分,这些代码会单独打包,一般我们会把引用的框架文件拆分出来,方便浏览器缓存,节省资源。
  23. vender:['react'],
  24. app: path.resolve(dfPath.root,'src/app.js')
  25. },
  26. output: {
  27. path: dfPath.dist,
  28. filename: 'assets/js/[name]_[chunkhash].bundle.js',
  29. publicPath: '/',
  30. chunkFilename: 'assets/js/[name].sepChunk.js',
  31. hashDigestLength: 6
  32. },
  33. module:{
  34. rules: [
  35. {
  36. test: /\.js$/,
  37. use:['babel-loader'],
  38. exclude: [
  39. dfPath.node_modules
  40. ]
  41. },
  42. /* 开启 css单独打包 和 css模块化的配置 */
  43. {
  44. test: /\.css$/,
  45. use: extractCSS.extract({
  46. use: [
  47. {
  48. loader: 'css-loader',
  49. options:{
  50. modules: true
  51. }
  52. }
  53. ]
  54. })
  55. },
  56. {
  57. test: /\.(png|jpg|jpeg|gif)$/,
  58. use: [
  59. {
  60. loader: 'url-loader',
  61. options:{
  62. limit:8192,
  63. name: '[name]_[hash].[ext]',
  64. outputPath: 'assets/img/'
  65. }
  66. }
  67. ],
  68. },
  69. {
  70. test: /\.(mp4|ogg|svg|ico)$/,
  71. use: [
  72. {
  73. loader: 'file-loader',
  74. options:{
  75. name: '[name]_[hash].[ext]',
  76. outputPath: 'assets/media/'
  77. }
  78. }
  79. ]
  80. },
  81. {
  82. test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/,
  83. use: [
  84. {
  85. loader: 'url-loader',
  86. options:{
  87. limit:10000,
  88. name: '[name]_[hash].[ext]',
  89. outputPath: 'assets/font/',
  90. mimetype: 'application/font-woff'
  91. }
  92. }
  93. ]
  94. },
  95. {
  96. test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
  97. use: [
  98. {
  99. loader: 'url-loader',
  100. options:{
  101. limit:10000,
  102. name: '[name]_[hash].[ext]',
  103. outputPath: 'assets/font/',
  104. mimetype: 'application/octet-stream'
  105. }
  106. }
  107. ]
  108. },
  109. {
  110. test: /\.eot(\?v=\d+\.\d+\.\d+)?$/,
  111. use: [
  112. {
  113. loader: 'file-loader',
  114. options:{
  115. name: '[name]_[hash].[ext]',
  116. outputPath: 'assets/font/',
  117. }
  118. }
  119. ]
  120. },
  121. {
  122. test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
  123. use: [
  124. {
  125. loader: 'url-loader',
  126. options:{
  127. limit:10000,
  128. name: '[name]_[hash].[ext]',
  129. outputPath: 'assets/font/',
  130. mimetype: 'image/svg+xml'
  131. }
  132. }
  133. ]
  134. },
  135. ]
  136. },
  137. plugins:[
  138. extractCSS,
  139. // 设置 process.env(生产环境) 环境变量的快捷方式。
  140. new webpack.EnvironmentPlugin({
  141. NODE_ENV: 'production'
  142. })
  143. ,new ClosureCompilerPlugin()
  144. ],
  145. devtool: 'source-map'
  146. };
  147. module.exports = strategyMerge(base,config);

webpack开发环境配置和生产环境配置的更多相关文章

  1. 【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!

    写在前面 在实际的企业开发环境中,往往都会将环境分为:开发环境.测试环境和生产环境,而每个环境基本上都是互相隔离的,也就是说,开发环境.测试环境和生产环境是互不相通的.在以前的开发过程中,如果开发人员 ...

  2. Tomcat与Jre绿色环境配置(生产环境)

    Tomcat与Jre绿色环境配置(生产环境) 博客分类: Apache Java jreapachetomcat  Tomcat运行时需要jre的支持,一般有两种方式,一种是用jdk带的jre,另一种 ...

  3. CentOS8本地安装Redash中文版,并且配置为生产环境

    Centos8内置的Python为3.6.8版本,以下是在内置Python3.6.8基础上的安装步骤.由于安装多版本Python会导致系统底层库需要下载源码重新编译,比较麻烦,不建议在多版本Pytho ...

  4. Spring.profile配合Jenkins发布War包,实现开发、测试和生产环境的按需切换

    前两篇不错 Spring.profile实现开发.测试和生产环境的配置和切换 - Strugglion - 博客园https://www.cnblogs.com/strugglion/p/709102 ...

  5. vue配置开发,测试,生产环境api

    npm run build 调用开发环境接口,打包开发环境npm run build:test 调用测试环境接口,打包测试环境npm run build:prod 调用生产环境接口,打包生产环境 vu ...

  6. Spring.profile实现开发、测试和生产环境的配置和切换

    软件开发过程一般涉及“开发 -> 测试 -> 部署上线”多个阶段,每个阶段的环境的配置参数会有不同,如数据源,文件路径等.为避免每次切换环境时都要进行参数配置等繁琐的操作,可以通过spri ...

  7. IDEA开发、测试、生产环境pom配置及使用

    pom文件 一般放在最下面,project里 <!--开发环境.测试环境.生产环境--> <!--生产环境--> <profiles> <profile> ...

  8. vue-cli 3.0 axios 跨域请求代理配置及生产环境 baseUrl 配置

    1. 开发环境跨域配置 在 vue.config.js 文件中: module.exports = { runtimeCompiler: true, publicPath: '/', // 设置打包文 ...

  9. Vue Nginx反向代理配置 解决生产环境跨域

    Vue本地代理举例: module.exports = { publicPath: './', devServer: { proxy: { '/api': { target: 'https://mov ...

随机推荐

  1. 使用域账号统一管理cisco网络设备

    1.思科设备和微软系统整合的背景: 公司内部有一定数量的客户端,为了实现统一化,在管理内部部署了域架构,这样可以通过组策略对客户端进行批量化管理,提高了管理的效率. 同样公司内部有一定数量的网络设备( ...

  2. 一个web应用的诞生(1)--初识flask

    基于flask的web应用的诞生 Flask是一个非常优秀的web框架,它最大的特点就是保持一个简单而易于扩展的小核心,其他的都有用户自己掌握,并且方便替换,甚至,你可以在社区看到众多开源的,可直接用 ...

  3. 使用EL表达式调用java方法

    首先,新建一个类,类中写一个静态方法 public class PrivilegeUtils { public static Boolean checkPrivilegeByName(User use ...

  4. bzoj 2176 最小表示

    2176: Strange string Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 419  Solved: 174[Submit][Status ...

  5. Appium疑难杂症

    坑之初体验 在Appium的初体验中,遇到了一些坑坑洼洼.将他们记录下来,以后方便查阅. 1. session大于60秒没接收到命令自动关闭 通过Appium-Python-Client连接到appi ...

  6. TCP/IP三次握手四次挥手

    本文通过图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道.如图所示,给出了TCP通信过程的示意图. TCP 三次握手四次挥手 主要包括三部 ...

  7. mysql无法启动的结果问题解决

    mac 上homebrew 安装的mysql,已经用了很长时间都没什么问题,今天 ERROR! The server quit without updating PID file (/usr/loca ...

  8. 解析setTimeout时间设置为0

    1.开胃菜,setTimeout为何物 首先看一下w3school上面对于setTimeout的解释 setTimeout(fn,millisec) 方法用于在指定的毫秒数后调用函数或计算表达式. 很 ...

  9. 我的Java设计模式-原型模式

    "不好意思,我是卧底!哇哈哈哈~"额......自从写了上一篇的观察者模式,就一直沉浸在这个角色当中,无法自拨.昨晚在看<使徒行者2>,有一集说到啊炮仗哥印钞票,我去, ...

  10. Nashorn——在JDK 8中融合Java与JavaScript之力

      从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript ...