webpack基础使用(三)

九、自动刷新
  1. 使用watch + live server
// 2种方式
// 1. package.json
"scripts": {
    "build": "webpack --watch"
}

// 2. webpack.config.js
module.exports = {
  watch: true,
  /**/
}

不足
1.所有源代码都会重新编译
2.每次编译成功之后都需要进行文件读写
3.live server是vscode的工具
4.不能实现局部刷新

  1. 使用webpack-dev-server
    yarn add webpack-dev-server --dev
// package.json
  "scripts": {
    "build": "webpack",
    "serve": "webpack serve"
  }
// 注意如果不是默认webpack配置,需要修改了配置文件名
// "serve": "webpack serve --config xx.webpack.js"

3.使用webpack-dev-middleware导出文件到一个服务器。
实际开发过程中,不是经常使用。
yarn add webpack-dev-middleware --dev

const express = require('express')
const webpackDevMiddleware = require('webpack-dev-middleware')
const webpack = require('webpack')

const app = express()

// 获取配置文件
const config = require('./webpack.config.js')
const compiler = webpack(config)

app.use(webpackDevMiddleware(compiler))

// 开启端口上的服务
app.listen(3000, () => {
  console.log('服务运行在 3000端口上')
})

运行node ./Server.js启动服务, 浏览器打开页面就可以了。

十、热更新
  1. HMR
// webpack.config.js
  // 开发阶段屏蔽 .browserslistrc
  target: 'web',
  // 开启HMR
  devServer: {
    hot: true
  }

// js文件
if (module.hot) {
  // 限制哪些文件需要热更新
  module.hot.accept(['./title.js'], () => {
    console.log('title.js模块更新')
  })
}

// 运行yarn serve
  1. React-HMR
    a. 安装react环境
    yarn add react react-dom --dev
    b. 安装webpack可以识别react预设
    yarn add @babel/preset-react --dev
    只是这样,并不能达到react热加载。

c. 使用react插件,首先需要一个插件负责把具体要使用的插件和webpack结合起来
yarn add @pmmmwh/react-refresh-webpack-plugin --dev
d. 安装react热加载插件
yarn add react-refresh --dev

// babel.config.js
module.exports = {
  presets: [
    [ '@babel/preset-env' ],
    // 识别jsx文件
    [ '@babel/preset-react' ]
  ],
  plugins: [
    // react热更新插件
    ['react-refresh/babel']
  ]
}


const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin')

// webpack.config.js
module.exports = {
  /*省略*/
  // 开发阶段屏蔽 .browserslistrc
  target: 'web',
  // 开启HMR
  devServer: {
    hot: true
  },
  module: {
    rules: [
      /*省略*/
      {
        // js或者jsx
        test: /\.jsx?$/,
        // 防止node_modules中的库也使用了babel,导致干扰
        exclude: /node_modules/,
        use: [ 'babel-loader' ]
      }
    ]
  },
  plugins: [
    /*省略*/
    // 负责让把具体要使用的插件和webpack结合起来
    new ReactRefreshWebpackPlugin()
  ]
}

3.Vue-HMR
a. 安装环境
yarn add vue
编译vue代码,将Vue 2.0模板预编译为呈现函数
yarn add vue-template-compiler --dev
b. 安装热加载插件
yarn add vue-loader --dev

// webpack.config.js
const VueLoaderPlugin = require('vue-loader/lib/plugin')

module.exports = {
  /* 省略 */ 
  // 开发阶段屏蔽 .browserslistrc
  target: 'web',
  // 开启HMR
  devServer: {
    hot: true
  },
  module: {
    rules: [
      /* 省略 */ 
      {
        test: /\.vue$/,
        use: ['vue-loader']
      }
    ]
  },
  plugins: [
   /* 省略 */ 

    // 针对vue-loader > 15的版本,需要手动设置插件
    new VueLoaderPlugin()
  ]
}
十、path路径
  1. output中的路径
// webpack.config.js
output: { 
    filename: 'js/main.js',
    // 输出到哪儿
    path: path.join(__dirname, 'dist'),

    // 默认空字符串, 浏览量会帮我们添加/
    // publicPath: ''

    // 自己添加/, 但是这样本地路径会找不到
    // publicPath: '/'

    // 相对路径, 本地可以访问,但是webpack serve会找不到 
    // publicPath: './'

    // 输出解析文件的目录,指定资源文件引用的目录
    // 由线上静态资源存放的路径决定的
    // 注意这边后面有个/
    publicPath: '/lg/'
  }
  1. devserver中的路径
devServer: {
    hot: true,
    static: {
      // 代表生成的文件在哪儿, 需要output里面publicPath和这里一致
      // 此路径下的打包文件可在浏览器中访问, 代表浏览器里面的路径
      publicPath: '/lg',
      // 我们打包之后的资源如果说依赖其它的资源,此时就告知去哪找。
      // 强烈建议使用绝对路径
      directory: path.join(__dirname, 'public'),
      // 监听directory
      watch: true
    },
  }
  • output
    publicPdth: index.html内部的弓|用路径
    域名+ publicPath + filename
  • devServer
    publicPath:指定本地服务所在的目录
    directory:我们打包之后的资源如果说依赖其它的资源,此时就告知去哪找。
  1. devServer 其他配置
    // 只热加载变化的部分
    hot: 'only',
    // 开启压缩
    compress: true,
    // 处理直接向后端请求,导致404的问题
    historyApiFallback: true,
十一、proxy代理设置

处理测试环境中跨域的问题

// webpack.config.js
proxy: {
      // /info/users
      // http://localhost:4000/info/users
      // https://api.github.com/info/users
      '/info': {
        target: 'https://api.github.com',
        // 重写
        pathRewrite: { "^/info": "" },
        // 修改host
        changeOrigin: true
      }
    }

// index.js
import axios from 'axios'
// http://localhost:8080/info/users
axios.get('/info/users').then((res) => {
  console.log(res.data)
})
十二、resolve模块解析规则
  1. 如果后缀是个文件,如果没有extension,那么会默认找js、json。
  2. 如果后缀是个文件夹,会默认找文件夹里面的index,然后按照文件的方式找。
  3. 手动添加extension 和 别名
// webpack.config.js
resolve: {
    // 添加新的扩展名
    extensions: [".js", ".json", '.ts', '.jsx', '.vue'], 
    // 添加别名
    // import Home from './components/Home' 
    // =>
    // import Home from '@/components/Home'
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  },
十三、source-map

在调试的时候可以定位到源代码中的信息,建议开发使用cheap-module-source-map 或者 cheap-module-eval-source-map

// 通过这个找到对应source-map文件,全量的
devtool: 'source-map'

// source-map直接base64直接在模块里面
devtool: 'eval-source-map’

// source-map直接base64直接在文件最后
devtool: 'inline-source-map’

// 只有行信息,没有列信息
devtool: 'cheap-source-map’

// 显示原始错误信息(不会空行优化)
devtool: 'cheap-module-source-map’

// 会生成source-map,不会主动有map映射标记, 三方包方便调试。
devtool: 'hidden-source-map’

// 会生成source-map,只有提示, 没有具体链接。 包含代码,线上使用。
devtool: 'nosource-source-map’
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容