0
点赞
收藏
分享

微信扫一扫

前端工程化 webpack

minute_5 2022-03-26 阅读 84
webpack

webpack

webpack 是前端项目工程化的具体解决方案
主要功能:他提供了友好的前端模块化的支持代码压缩处理浏览器兼容性,性能优化等功能

npm init -y
npm install jquery -S

安装webpack

 npm install webpack webpack-cli -D

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eDBNeXOp-1648286335829)(images/4a48fb1f5cd3972e7b0cec59404d9c5b7608d6dda670d6273bb8ee226aa64579.png)]

-S --save
-D --save-dev

通过npmjs.com查看安装时选择-S还是-D

index.js 配置基础语句 以隔行变色为例

// es6导入语法
import $ from 'jquery'


// 定义jquery入口函数
$(function(){
    $('li:odd').css('background-color','red')
    $('li:even').css('background-color','pink')
})

项目中配置webpack

1.创建webpack.config.js配置文件并初始化

module.exports = {
    // 代表webpack运行模式,可选值 development  production
    mode:'development'
}

2.在package.json的stript节点,新增dev脚本

  "scripts": {
    "dev":"webpack"
  },

3.在终端中运行npm run dev命令,启动webpack项目的打包构建

npm run dev

4.生成dest文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nQR7rGju-1648286335830)(images/4618bfb93bfcb298ed25e542651c9a9ffa10bf9637d33b7d07742f259f9f04d1.png)]

5.修改index.html下 js引入路径

<!-- <script src="index.js"></script> -->
<script src="../dist/main.js"></script>

webpack可选值应用场景

module.exports = {
    // 代表webpack运行模式,可选值 development  production
    mode:'production'
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zl8G9cuP-1648286335831)(images/63d0edabf5bbb75e1d9c077177422512ee81e26ab02165869af143ec958c960d.png)]

开发时使用development 因为追求的是打包的速度,而不是体积
反过来 发布时使用production 因为上线需要的是体积小

webpack的默认约定

  • webpack4.x和5.x的版本中
    • 默认打包入口文件 src --> index.js
    • 默认输出文件 dist --> main.js

导入node文件模块

const path = require("path/posix");
    // entry:指定要处理哪个文件
    entry:path.join(__dirname,'./src/index.js'),
    output:{
        // 存放目录
        path:path.join(__dirname,'dist'),
        // 生成的文件名
        filename:'bundle.js'
    }

webpack插件

webpack-dev-server
自动打包和构建
html-webpack-plugin
webpack中的HTML插件,可以定制index.html页面内容

npm install webpack-cli -D

2.修改package.json

  "scripts": {
    "dev": "webpack serve"
  },

3.浏览器访问
http://localhost:8080/

在这里插入图片描述

webpack在根目录中写入了一个bundle.js文件
但这个文件是保存在内存中的,所以看不见
更改html引用路径

<script src="/bundle.js"></script>

html-webpack-plugin

npm install html-webpack-plugin -D

1、导入HTML插件,得到一个构造函数

const HtmlPlugin = require('html-webpack-plugin')

2、创建HTML插件的实例对象

const htmlPlugin = new HtmlPlugin({
    template:'./src/index.html', // 指定要复制哪个页面
    filename:'./index.html'//指定复制出来的文件名和存放路径
  });

})

3、插件的数组,将来webpack在运行时,会加载并调用这些插件
在module.exports里添加

plugins:[htmlPlugin]

复制后的页面会自动添加上内存里的js

devServer节点

    devServer:{
        open:true,//是否自动打开浏览器
        port:80,//指定端口号
        host:'127.0.0.1',//指定主机地址
    }
const path = require('path');

const HtmlPlugin = require('html-webpack-plugin'); //导入HTML插件

const htmlPlugin = new HtmlPlugin({   //创建实例对象
    template:'./src/index.html', // 指定要复制哪个页面
    filename:'./index.html'//指定复制出来的文件名和存放路径
  });

module.exports = {
    mode:'development',
    entry:path.join(__dirname,'./src/index.js'),
    output:{
        filename:'bundle.js'
    },
    plugins:[htmlPlugin],
    devServer:{
        open:true,//是否自动打开浏览器
        port:80,//指定端口号
        host:'127.0.0.1',//指定主机地址
    }
}

loader概述

webpack处理不了非.js后缀的模块
需要调用loader加载器才可以正常打包

loader加载器的作用给:协助webpack打包处理器特定的文件模块

  • css-loader 处理css
  • less-loader 处理.less
  • babel-loader 处理webpack无法处理的高级JS语法

现在在src文件下创建css文件下index.css
在index.js中导入样式

import './css/index.css'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qA7RT7Yn-1648286473040)(images/829636e6522442d6641685c05aff8042d71b372a01819026ffc7d46f46da001a.png)]

打包处理css文件

1.安装依赖

npm i style-loader css-loader -D

2.在webpack.config.js 的module->rules数组中,添加loader

    module:{//所有第三方文件模块的匹配机制
        rules:[
            {
                test:/\.css$/,user:['style-loader','css-loader']
            }
        ]
    }

test标识匹配的文件类型
user标识要调用的loader

  • user数组中指定的loader顺序是固定的
  • 多个loader的调用顺序是从后往前调

打包处理less文件

1、运行安装命令

npm i less-loader less -D

2、在webpack.config.js 的module->rules数组中,添加loader

    module:{//所有第三方文件模块的匹配机制
        rules:[
            {
                test:/\.css$/,use:['style-loader','css-loader']
            },
            {
                test:/\.less$/,use:['style-loader','css-loader','less-loader']
            }
        ]
    }

处理url路径相关的文件

npm i url-loader file-loader

index.html

    <!-- 需求把/src/images/bg.jpg设置给src属性 -->
    <img src="" alt="" class="box">

index.js

// 导入图片,得到图片文件
// 导入图片,得到图片文件
import bg from './images/bg.jpg'
$('.box').attr('src',bg)

webpack.config.js

    module:{//所有第三方文件模块的匹配机制
        rules:[
            {
                test:/\.css$/,use:['style-loader','css-loader']
            },
            {
                test:/\.less$/,use:['style-loader','css-loader','less-loader']
            },{
                test:/.jpg|png|gif$/,use:['url-loader?limit-22229']
            }
        ]
    }

limit用来指定图片的大小,单位是字节
只有≤limit大小的图片,才会被转为base64格式的图片

处理js文件的高级语法babel-loader

index.js

// 定义装饰器函数
function info(target){
    target.info = 'Person info'
}

// 定义一个普通的类
@info
class Person{}

console.log(Person.info)

1.安装babel-loader相关包

npm install -D babel-loader @babel/core @babel/preset-env @babel/plugin-proposal-decorators 

2.在webpack.config.js添加规则

{
  test: /\.m?js$/,
  exclude: /(node_modules|bower_components)/, // 排除不需要打包的目录
  use: {
    loader: 'babel-loader',
    options: {
      presets: ['@babel/preset-env']
      
    }
  }
}

3.在根目录创建babel.config.js

module.exports = {
    "plugins": [
        ["@babel/plugin-proposal-decorators", { "legacy": true }]
      ]
  }

注:babel插件文档
webpack安装babel-loader文档

打包发布

1.开发环境下,打包生成的文件存放在内存中
2.开发环境下,打包生成的文件不会进行代码压缩和性能化

配置webpack打包发布

在package.json在scripts节点下,新增build命令

"build":"webpack --mode production"

–mode是用来指定webpack的运行模式
production代表生产环境,会对代码进行代码压缩和性能优化

注意:–model指定的参数项会覆盖webpack.config.js中的model选项

优化图片和文件的存放目录

在webpack.config.js中output模块下指定js存放目录

    output:{
        filename:'js/bundle.js'
    }

在webpack.config.js中module模块rules下指图片存放目录

 {
     test:/.jpg|png|gif$/,use:{
         loader:'url-loader',
         options:{
             limit:22228,
             // 明确指定打包生成的图片文件存储到dist目录下的images文件夹
             outputPath:'image'
         }
 }

自动清理dist目录下的旧文件

1.安装clean-webpack-plugin

npm install clean-webpack-plugin -D

2.在webpack.config.js中按需导入插件,得到插件的构造函数之后,创建插件的实例对象

const { CleanWebpackPlugin } = require('clean-webpack-plugin');

3.把创建的cleanPlugin的插件实例对象,挂载到plugins节点上

plugins: [htmlPlugin,new CleanWebpackPlugin()]

4.webpack5.x之后,需要在output中配置path路径

output: {
    filename: 'js/bundle.js',
    path: path.resolve(process.cwd(), 'dist')
}

source Map

Source Map 就是一个信息文件,里面存储着位置信息。也就是说,Source Map文件中存储着压缩混淆后的代码所对应的位置

出错的时候,除错工具将直接显示原始代码,而不是转换后的代码

在开发调试的时候,建议将值设为eval-source-map

开发环境下,webpack默认启动了Source Map功能,当程序运行出错的时候,可以直接通过控制台提示错误行位置定位到具体的源代码,开发环境下添加以下代码,能保证报错代码与源代码行数保持一致

在webpack.config.js中添加

devtool:'eval-source-map'

在生产环境下,如果省略了devtool选项,则最终生成的未见不包含Source Map 这能防止源码泄露
在生产环境下,如果想定位报错的具体行数,而不暴露源代码,可以将devtool的值设置为nosources-source-map

实际开发中,我们不需要自己配置webpack
会使用CLI 一键生成带有webpack的项目
开箱即用,我们只需知道webpack的基本概念即可

总结

1.能够掌握webpack的基本使用
安装、webpack。config.js 修改打包入口
2.了解常用的plugin的基本使用
webpack-dev-server html-webpack-plugin
3.了解常用的loader的基本使用
loader的作用 loader的调用过程
4.能够说出Source Map的作用
精准定位到错误行并显示对应的源码
方便开发者调试源码中的错误

补充 webpack 路径别名

webpack.config.js添加与module同级模块resolve

    resolve: {   //路径起别名
        alias: {
          '@': path.resolve(__dirname, './src/'),
        },
      },

使用@表示 src目录

举报

相关推荐

0 条评论