webpack 学习笔记
- entry 打包入口
1 | //单入口 |
搭建服务器 webpack-dev-server
- 安装
1 | yarn add webpack-dev-server -D |
- 使用
1 | devServer:{ |
转化 es6 语法
安装 babel-loader loader 核心模块,将 es6 转化成 es5 的插件
1
2yarn add babel-loader @babel/core @babel/preset-env @babel/plugin-proposal-class-properties @babel/plugin-transform-runtime -D
yarn add @babel/runtime配置
1 | rules:[ |
class 和 decorator 插件 json 写法
1 | "plugins": [ |
- 配置好后需要排除 node_modules,否则 warning
1 | include:path.resolve(__dirname,'src'), |
使用 eslint 进行代码校验
- 安装
1 | npm install eslint-loader eslint --save-dev |
- 配置
1 | { |
- 在 eslint 官网,配置语法规则,下载配置文件eslintrc.json,修改配置文件名为.eslintrc.json
Rules Configuration
引入第三方模块
- 安装
1 | yarn add jquery |
- 配置
- 直接使用
1 | import $ from 'jquery' |
- 暴露到全局
1、模块中配置
1 |
|
2、webpack 中配置
1 | rules:[ |
- 在每个模块中注入依赖
1 | const webpack = require('webpack') |
- 通过 cdn 引入
1 | <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> |
同时使用 cdn 和 npm,但是不打包到项目中,这个研究了一下午,这么绕,纯粹扯淡
- 使用
1 | import $ from 'jquery'; |
- 配置
1 | externals:{ |
图片处理
1、js 中创建图片,
1 | import logo from './logo.png'; |
- loader
1 | yarn add file-loader url-loader -D |
默认会在内部生成一张图片,放到 build 目录下,并返回图片名字
2、css 中背景图片
background: url(‘./logo.png’)
3、html 中使用
loader:
1 | yarn add html-withimg-loader -D |
配置
1 | { |
使用 url-loader,小于 limit 的时候将图片打包为 base64,减少 url 请求
url-loader 内置了 file-loader,不依赖 file-loader
1 | { |
打包文件分类
- 设置打包后文件路径
- 打包图片
1 | { |
- 打包 css
1 | new MiniCssExtractPlugin({ |
同时 MiniCssExtractPlugin.loade 也需要配置 publicPath,否则 css 中的背景图片无法显示
1 | { |
- 配置打包后资源的公共路径
- 所有资源配置相同的地址
1 | output:{ |
- 只处理图片
1 | { |
打包为多页面应用
webpack.config.js
1 | module.exports={ |
生成多个 html
1 | const htmlWebpackPlugin = require('html-webpack-plugin'); |
配置 source-map
报错时映射到源文件
1 | //1、源码映射,单独生成映射文件,出错标当前出错的位置 生成文件大,全 |
watch
监控文件的变化,即使打包
配置
1 | watch:true |
打包前清空 dist
- 安装
1 | yarn add clean-webpack-plugin -D |
- 配置
1 | const cleanWebpackPlugin = require('clean-webpack-plugin') |
copy-webpack-plugin
在根目录新建 doc 文件夹存放需要拷贝的文件
打包时将 webpack 拷贝到 dist 文件中
- 安装
1 | yarn add copy-webpack-plugin -D |
- 配置
1 | const copyWebpackPlugin = require('ccopy-webpack-plugin') |
打包代码前面都添加统一的签名
webpack 自带插件 BannerPlugin
1 | new webpack.BannerPlugin('明天和意外') |
webpack 跨域问题
1)请求后端
- 配置 server.js node server
1 | const express= require(express); |
- 发请求
1 | let xhr = new XMLHttpRequest(); |
- 配置代理
1 | devServer:{ |
所有以/api 开头的都去访问 3000 端口
如果后端没有约定是以 api 开头的,请求之后重写 api 为空
1 | devServer:{ |
2)前端模拟数据
1 | devServer:{ |
3)在服务端使用 webpack
- 中间件
1 | yarn add webpack-dev-middleware |
- server.js 配置,接口会同时配置在 server 的 3000 和 webpack 的 8080
1 | const express = require('express'); |
resolve 解析第三方包
- 只在当前文件夹内解析
1 | resolve:{ |
- 安装 bootstrap
1 | yarn add bootstrap |
使用 import bootstrap from ‘bootstrap’引入的是 bootstrap.js
使用别名直接引入 bootstrap.css
1 | resolve:{ |
指定解析的文件入口顺序
1 | mainFields:['styles','main']; |
省略文件后缀
1 | extensions:['.css','.js','.json'] |
定义环境变量
1 | new webpack.DefinePlugin({ |
区分不同环境
webpack.base.js
webpack.dev.js
webpack.prod.js
- 合并 webpack 配置
1 | yarn add webpack-merge -D |
- 使用
1 | //webpack.dev.js |
noParse
1 | noParse:/jquery/, //不去解析jquery中的依赖库 |
ignorePlugin
1 | modules:{ |
忽略引入文件的内部文件
- 安装 moment
1 | yarn add moment -D |
- 使用
1 | let r = moment().endOf('day').fromNow(); |
- 显示中文时间
1 | moment.locale('zh-cn') |
打包时忽略 moment 的语言包引入
1 | new webpack.IgnorePlugin(/\.\/locale/,/moment/) |
- 手动引入中文
1 | import 'moment/locale/zh-cn' |
动态链接库 dllPlugin
打包不需要每次更改都需要重新打包的文件
- 安装 React React-dom
1 | yarn add React React-dom |
- React 代码
1 | import React from 'React'; |
- 抽离 React,React-dom 单独打包
webpack.React.js
1 | let path = require('path'); |
- html 中引入打包后文件
1 | <script src='/_dll_React.js'></script> |
- webpack.config.js
引用 dll 插件,引用模块的时候会先查找 dll 里面的清单找不到的时候再打包
1 | new webpack.DllReferencePlugin({ |
打包
1 | npx webpack --config webpack.React.js |
多线程打包 happypack
- 安装
1 | yarn add happypack -D |
- 引入
1 | import happypack from 'happypack' |
- 使用
1 | modules: { |
多页面打包抽取公共代码
1 | optimization:{ |
懒加载
安装 js 插件@babel/plugin-syntax-dynamic-import
- 配置
1 | { |
- 使用 获取资源文件
1 | import('./source').then(data=>{ |
热更新
- 启用热更新
1 | devServer:{ |
- 插件
1 | plugins:[ |
- 模块里面的使用
1 | if(module.hot){ |