第二章:webpack初探
第三章:webpack 核心概念
第四章:webpack进阶
第五章:webpack 实战配置案例
第六章: webpack 底层原理及脚手架工具分析

第二章:webpack初探

webpack 是什么?

直接写import在浏览器中是不认识的。webpack可以把代码进行翻译。

什么是模块打包工具

webpack is a module bundler. 模块打包工具

webpack 的正确安装方式

node安装 https://nodejs.org/en/

初始化文件夹 npm init 生成一个package.json
image.png

package,.json 一些设置

调整package.json 文件 确保安装包是私有的(private)并且移除main入口 防止意外发布代码


  1. "private": true

安装
全局安装的方式并不好

  1. npm install webpack webpack-cli -g

卸载

  1. npm uninstall webpack webpack-cli -g

在项目中安装

  1. npm install webpack webpack-cli -D

查看当前项目中webpack的版本

  1. npx webpack -v

优点:
可以在不同的项目中使用不同版本的webpack

  1. npm install webpack@4.16.5 webpack-cli -D

webpack的配置文件

webpack.config.js(手动新增)

  1. const path = require('path')
  2. module.exports = {
  3. entry:'./index.js',
  4. output:{
  5. filename:'bundle.js',
  6. path:path.resolve(__dirname,'bundle')
  7. }
  8. }

需要新建一个index,js文件,因为上述指出了入口文件是 ./index.js

执行打包

  1. npx webpack

打包结果:会在根目录下生成一个bundle文件夹,里面是bundle.js文件

以自己命名的配置文件进行打包

  1. npx webpack --config webpackconfig.js

使用npm脚本
修改package.json 中 scripts 设置

  1. "scripts": {
  2. "bundle":"webpack"
  3. },
  4. 这时候就可以使用npm run 的命令运行项目
  5. npm run bundle

总结
global
webpack index.js

local
npx webpack index.js

npm run bundle => webpack

webpack-cli 的作用是让我们正常运行webpack的命令


浅析webpack打包输出内容

image.png

这个main.js哪里来的

  1. const path = require('path')
  2. module.exports = {
  3. entry:'./index.js',
  4. output:{
  5. filename:'bundle.js',
  6. path:path.resolve(__dirname,'bundle')
  7. }
  8. }
  9. =>
  10. entry:{
  11. main:'./index.js'
  12. }

报警告的原因

[
mode文档](https://www.webpackjs.com/concepts/mode/)
提供 mode 配置选项,告知 webpack 使用相应模式的
内置优化

  1. const path = require('path')
  2. module.exports = {
  3. mode:'production', //新增加
  4. entry:'./index.js',
  5. output:{
  6. filename:'bundle.js',
  7. path:path.resolve(__dirname,'bundle')
  8. }
  9. }

第三章:webpack 核心概念

loader 是什么

file-loader 模块 官网

模块安装

  1. npm install file-loader -D

配置文件添加规则 webpack.config.js

  1. const path = require('path')
  2. module.exports = {
  3. mode:'production',
  4. entry:'./src/index.js',
  5. module:{
  6. rules:[{
  7. test:/\.jpg$/,
  8. use:{
  9. loader:'file-loader'
  10. }
  11. }]
  12. },
  13. output:{
  14. filename:'bundle.js',
  15. path:path.resolve(__dirname,'dist')
  16. }
  17. }

图片打包完之后输出的结果

image.png

file-loader 打包原理:先将文件资源移动到dist目录下,然后将返回值返回给变量。

使用loader 打包静态资源(图片篇)

让图片跟原始名称保持一致

placeholder 可以自定义文件名

  1. const path = require('path')
  2. module.exports = {
  3. mode:'production',
  4. entry:'./src/index.js',
  5. module:{
  6. rules:[{
  7. test:/\.jpg$/,
  8. use:{
  9. loader:'file-loader',
  10. options:{
  11. //placeholder 占位符
  12. name:'[name].[ext]' //配置
  13. }
  14. }
  15. },
  16. {
  17. test:/\.vue$/,
  18. use:{
  19. loader:'vue-loader'
  20. }
  21. }]
  22. },
  23. output:{
  24. filename:'bundle.js',
  25. path:path.resolve(__dirname,'dist')
  26. }
  27. }

打包后你重新替换图片文件,这时候页面是不会改变的,因为你此时运行的已经是你之前打包过的文件。

保存到指定的文件夹

  1. options:{
  2. //placeholder 占位符
  3. name:'[name].[ext]',
  4. outputPath:'images/'
  5. }

实战代码

  1. project
  2. webpack-demo
  3. |- package.json
  4. |- webpack.config.js
  5. |- /dist
  6. |- bundle.js
  7. |- index.html
  8. |- /src
  9. + |- icon.png
  10. |- style.css
  11. |- index.js
  12. |- /node_modules
  13. src/index.js
  14. import _ from 'lodash';
  15. import './style.css';
  16. + import Icon from './icon.png';
  17. function component() {
  18. var element = document.createElement('div');
  19. // Lodash,现在由此脚本导入
  20. element.innerHTML = _.join(['Hello', 'webpack'], ' ');
  21. element.classList.add('hello');
  22. + // 将图像添加到我们现有的 div。
  23. + var myIcon = new Image();
  24. + myIcon.src = Icon;
  25. +
  26. + element.appendChild(myIcon);
  27. return element;
  28. }
  29. document.body.appendChild(component());

url-loader
**

打包之后图片是base64的,直接在js文件内,并不是引用外部文件的地址。

**
有一个limit 的设置。可以根据这个值来实现打包的方式。

  • 大于这个值 就会像file-loader实现一样
  • 小于这个值 直接打包到js文件

最佳使用方式:图片很小的时候用这种方式打包

设置文件大小分情况进行打包

  1. options:{
  2. //placeholder 占位符
  3. name:'[name].[ext]',
  4. outputPath:'images/',
  5. limit:2048
  6. }

使用loader 打包静态资源(样式篇)

第一部分

css打包 规则配置

  1. 规则配置
  2. {
  3. test:/\.css$/,
  4. use:[
  5. 'style-loader','css-loader'
  6. ]
  7. },

安装插件

  1. npm install style-loader css-loader -D

问题:在使用scss 语法进行打包后,不可以正常显示

安装 sass-loader 插件
**

  1. npm install sass-loader node-sass --save-dev
  1. 规则配置
  2. {
  3. test:/\.css$/,
  4. use:[
  5. 'style-loader','css-loader','sass-loader'
  6. ]
  7. },

loader的执行顺序 从下到上,从右到左

问题:transform不会添加厂商前缀,(兼容写法)

postcss-loader 自动添加

安装

  1. npm i -D postcss-loader

修改配置文件(新增规则)

  1. {
  2. test: /\.scss$/,
  3. use: [
  4. 'style-loader',
  5. 'css-loader',
  6. 'sass-loader',
  7. 'postcss-loader'
  8. ]
  9. }

在根目录下创建文件 postcss.config.js

  1. module.exports = {
  2. plugins: {
  3. }
  4. }

安装 autoprefixer 插件

  1. npm install autoprefixer -D
  1. module.exports = {
  2. plugins:[
  3. require('autoprefixer')
  4. ]
  5. }

注意问题:
按照上述写的,发现页面中并不会生效

解决方法:

  1. module.exports = {
  2. plugins: [require("autoprefixer")({ browsers: ["last 15 versions"] })]
  3. };

第二部分

css-loader 的额外配置
在import 中又引入了scss

  1. module: {
  2. rules: [
  3. {
  4. test: /\.scss$/,
  5. use: [
  6. "style-loader",
  7. {
  8. loader: "css-loader",
  9. options: {
  10. importLoaders: 2 //保证依次从下到上执行所有的loader
  11. }
  12. },
  13. ,
  14. "sass-loader",
  15. "postcss-loader"
  16. ]
  17. }
  18. ]
  19. }

使用模块化的css
文档

配置

  1. {
  2. test: /\.scss$/,
  3. use: [
  4. 'style-loader',
  5. {
  6. loader:'css-loader',
  7. options:{
  8. importLoaders:2,
  9. modules:true //
  10. }
  11. },
  12. 'sass-loader',
  13. 'postcss-loader'
  14. ]
  15. }
  1. import avatar from './avatar.jpg'
  2. import style from './index.scss' //
  3. import createAvatar from './createAvatar'
  4. createAvatar()
  5. var img = new Image()
  6. img.src = avatar
  7. img.classList.add(style.avatar) //
  8. var root = document.getElementById('root')
  9. root.append(img)
  1. root.append('<div class="test">abc</div>')
  2. root.innerHTML = '<div class="test">abc</div>'

如何进行字体文件的打包

字体文件打包未成功

使用 plugins 打包更便捷