初试 WebPack

如何解决作用域问题

匿名函数自执行的方式

;(function(){
let myname = '我是name'
})()
//console.log(myname) error·

//如果向外暴露的话
let result = (function(){
let myname = '我是name'
return myname
})();
console.log( result ) // 我是name

如何解决代码拆分问题

common.js

moudle.export = { }

const x = require(' ')

问题:浏览器不能用 common.js

如何让浏览器支持模块

加载  require.js 

安装

webpack Vite 作为 前端热门的工程化工具 各自有各自的使用场景

安装 webpack

首先确保安装了 node.js 因为webpack 是构建在 node.js 之上的

npm i webpack webpack-cli -global   //全局安装 不推荐
webpack -v

npm i webpack webpack-cli --save-dev
npx webpack

自定义配置webpack 配置

创建一个为 webpack.config.js 的配置文件

// webpack.config.js 
const path = require('path')
module.exports = {

entry:'./src/index.js' //设置需要打包的入口文件

//设置打包出口文件 output 配置对象
output:{
filename:'bundle.js' //指定输出文件的文件名
path:path.resolve(__dirname,'./dist' ) //绝对路径
clean:'true'
},

mode:'none'
}

如何自动引入打包后的资源

使用webpack 插件

1.1 使用 HtmlWebpackPlugin

npm i html-webpack-plugin -D
// webpack.config.js 
const HtmlWebpackPlugin = require('html-webpack-plugin')
const path = require('path')
module.exports = {

entry:'./src/index.js' //设置打包入口文件

//设置打包出口文件 output 配置对象
output:{
filename:'bundle.js' //z指定输出文件的文件名
path:path.resolve(__dirname,'./dist' ) //绝对路径
},

mode:'none', //开发模式
//数组插件
plugins:[
//配置自动生成的html的选项
new HtmlWebpackPlugin({
template:'./index.html', //模板html文件
filename:'app.html', //生成的html文件名
inject:'body' //控制scipt标签生成的位置
})
],
//webserver 浏览器实时刷新
devServer:{
static:'./dist'
},
module:{
rules:[
{
test:'',
type:'',
}
]
}
}

//错误指向配置

devtool:'inline-source-map'  

观察模式 (每次 npx webpack 很麻烦 ) 所以

npx webpack --watch    
//每次保存将自动编译新的代码 但是需要手动刷新浏览器

实时刷新html页面 webpack-dev-server

npm install webpack-dev-server -D 	

webpack-dev-server 提供一个基本的webserver

配置:

devServer:{
static:'./dist' //指定的
}

执行:

npx webpack-dev-server

(图片)资源类型

一,Resource 资源 asset/Resource 他是以URL的形式显示出来的

//配置资源文件
module:{
rules:[ {
test:'/\.png$/' // reg正则定义加载的类型 打包后缀为png的突破按
type:'asset/resource'
}
]
}

如何自己定义文件的目录 以及文件名

  1. 在output 里设置

    output:{
    //设置资源模块文件名
    assetModuleFilename:'images/[contenthash][ext]'
    }
  2. 在module 里设置

module:{
rules:[
{
test:'',
type:'',
generator:{
filename:'images/[contenthash][ext]'
}
},
]
}

二、asset/inline 是以 Data URL base64 格式 显示出来的 (图片不会显示在dist文件目录下)

module:{
rules:[{
test:/\.svg/ // reg正则定义加载的类型 打包后缀为png的突破按
type:'asset/inline'
}
]
}

三、asset 是以resource 和 inline 这两种方法选择

//默认情况下webpack会判断资源的大小 大于8kb创建一个资源 小于8kb则base64
module:{
rules:[
{
text:/\.jpg$/,
type:'asset',
//调整临界值
parser:{
dataUrlCondition:{
maxSize:4 * 1024 * 1024
}
}
}
]
}

loader (解析其他文件 转化为 有效的模块)例: CSS

npm install css-loader -D    //帮助解析css文件 进行导入
npm install style-loader -D //帮助吧导入的css 放置在页面上

问: 能不能解析其他的css 的预处理文件 比如 sass less ...
less:
npm install less-loader less -D
module:{
rules:[
{
test:/\.(css|less)$/,
type:['style-loader','css-loader','less-loader'] //从后 往前 进行调用
}
]
}

抽离出css出来

插件

npm install mini-css-extract-plugin -D   //wp5
const MiniCssExtractPlugin = require('mini-css-extract-plugin‘)

plugins:[
new MiniCssExtractPlugin({
filename:'styles/[contenthash].css' //给她设置打包后的默认路劲和文件名称
})
]
module:{
rules:[
{
test:/\.(css|less)$/,
type:[MiniCssExtractPlugin.loader,'css-loader','less-loader'] //从后 往前 进行调用
}
]
}

压缩css

mode:'production'  //改为生产环境
optimization:{
minimizer:[
new
]
}