webpack

webpack

客户端 静态资源服务器 接口服务器

​ 本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

五个核心概念

  • Entry:入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始
  • Output:output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件
  • Loader:loader 让 webpack 能够去处理那些非 JavaScript 文件
  • Plugins:插件则可以用于执行范围更广的任务。例如:打包优化、压缩
  • Mode:模式,有生产模式 production 和开发模式 development

1 node包的查找机制

node对包进行以下处理:

 1. 遍历module.paths数组查找对应包名下的package.json文件.
    通过JSON.parse()解析出包描述对象,
    通过其中的main属性的文件名进行再次定位查找,
    如果该文件名没有扩展名,再次按照之前的文件扩展名补足方式进行补足(js json node)

 2. main属性指定的文件名错误,或者当前目录不存在package.json文件,
    Node会把index当做默认文件名,依次查找 index.js | index.json | index.node.

 3. 如果在目录分析的过程中没有成功定位到任何文件或目录,
    则按照module.paths,遍历该路径数组,如果都不存在就报错

2 webpack包的查找机制

安装 npm i webpack@4.44.2 webpack-cli@3.3.12 -D

① 模块化打包:webpack [entry] -o [output]

配置脚本 package.json

运行 npm run webpack

安装lodash: npm i lodash

1. 找别名
        resolve:{
            alias:{
                //$: 重新让lodash具备了包的能力
                lodash$:path.resolve(__dirname, 'src/damu.js'),
            }
        }
2. 找resolve.modules(默认值为node_modules)指定的文件夹
3. 找对应的包
    -- 有package.json
        按照顺序查找 resolve.mainFields(默认值['browser', 'module', 'main']) 配置选项中指定的字段
    -- 没有package.json
        按照顺序查找 resolve.mainFiles(默认值['index']) 配置选项中指定的文件名
        文件扩展名通过 resolve.extensions (默认值['.wasm', '.mjs', '.js', '.json'])选项

注意:

  • 配置别名webpack.config.js 可以不用在node_modules中去找

  • 配置了别名就不用在原来的包配置(别名的优先级大于包),可以加$,可以在别名和包之间切换

3 webpack基本使用

安装webpack:npm i webpack@4.44.2 webpack-cli@3.3.12 -D

配置webpack:新建webpack.config.js配置文件

const path = require('path');
module.exports = {
   entry: './index.js',
   output: {
       filename: 'index.js',
       path: path.resolve(__dirname, 'dist')
   },
   //确定webpack中是如何去找模块的(可以不用)
   resolve:{
       alias:{
           //
           lodash$:path.resolve(__dirname, 'src/damu.js'),
       }
   }
};

使用webpack: 在webpack.config.js同级目录下敲webpack

4 公共需求

4.1 处理js

① webpack默认就可以打包ES6模块化代码(处理模块化语法)

② 使用babel处理es6的兼容性问题(语法:不包含模块化语法 API)

配置babel

安装:

npm install --save-dev babel-loader @babel/core

配置babel-loader:在webpack.config.js中

module:{
	rules:[
		{
            test:/\.js$/,
            use:’ babel-loader’,
            exclude:/node_modules/}
	]
	}

安装预设套餐处理语法的兼容性问题:babel-presets

npm install @babel/preset-env --save-dev

① 安装es6全局衬垫代码处理API的兼容性问题:业务级别

npm install @babel/polyfill --save
配置:直接在入口文件引入衬垫  import ‘@babel/polyfill’
配置.babelrc可以不用引入了,直接实现按需引入衬垫("useBuiltIns":"usage"):
npm install core-js@3 --save

babel的配置:

{
	"presets":[
		["@babel/preset-env",
			{
				"useBuiltIns":"usage",
				"corejs":3
			}
		]
	]
}

② 安装es6局部衬垫代码处理API的兼容性问题:第三方库级别的兼容性问题

npm install @babel/plugin-transform-runtime --save-dev
npm install @babel/runtime
npm i @babel/runtime-corejs3

配置:新建 .babelrc 文件

{
    "presets":[
        "@babel/preset-env"
    ],
        "plugins": [
            [
                "@babel/plugin-transform-runtime",
                {
                    "corejs":3
                }
            ]
        ]
}

4.2 处理css

用link标签每次都要加载 作为模块引入,但是打包会报错


(^托字符      注意要降某些lode的版本 npm i     npm webpack )

#### ① 处理原生CSS

1. 安装配置style-loader 和 css-loader

2. 在js文件中直接import 样式表文件

```js
npm i style-loader css-loader postcss-loader postcss -D

配置postcss环境:

 安装autoprefixer: npm i autoprefixer -D
 抒写.postcssrc.js
 	const autoprefixer = require("autoprefixer");
 	module.exports={
 		plugins:[
 		autoprefixer()
 	]
 }

配置loader

{
	test:/\.css$/,
	use:[
		"style-loader",
		"css-loader",
		"postcss-loader"
	]
}
② 如何使用less
在1的基础上;加上less-loader less
安装: npm i less less-loader -D

配置loader

{
	test:/\.less$/,
	use:[
		"style-loader",
		"css-loader",
		"postcss-loader",
		"less-loader"
	]
}
③ 如何使用postcss

安装配置postcss-loader postcss **autoprefixer ** 并写配置.pastcss.js

4.3 处理HTML

① 自动生成Html 并注入打包生成的js文件

使用HtmlWebpackPlugin插件

 npm install html-webpack-plugin --save-dev

引入 webpack.config.js

 const HtmlWebpackPlugin = require('html-webpack-plugin');

配置:自动生成HTML文件

plugins:[
     new HtmlWebpackPlugin({
           filename:"index.html",     //最终打到output的名称
           template:"./index.html",   //html模板
           inject:true                //自动注入打包后的js文件呢
       })
    ]
② 每次打包自动清除dist目录

安装

npm install clean-webpack-plugin --save-dev

引入

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

配置

  plugins:[
    new CleanWebpackPlugin ()
   ]
③ 如何在Html中引入图片

首先要配置图片相关的loader: 使用html-loader

npm install html-loader -D
{
	test:/\.html$/,
	use:[
		{
            loader:'html-loader',
            options:{
            attributes:true
		}
	  }
	]
}

4.4 处理静态资源(图片 字体)

① 需要引入的loader

file-loader:让webpack可以将静态资源纳入管理

url-loader:base64编码

② CSS中引入图片

安装配置file-loader后,webpack就可以自动处理图片了

npm file-loader -D
{
   test:/\.(jpg|jpeg|png|gif)$/,
   use:[
     {
       loader:"file-loader",
       options:{
         publicPath:"./dist/img",  //发布目录
         outputPath:"img",    //输出目录
         name:"[name].[hash:8].[ext]"  //静态资源最终的名称
       }
     }
   ]
 }

注意:

publicPath:定义发布目录:最终heml文件如何去寻找静态资源

​ 默认情况下html文件找资源是基于输出目录的,相对的根路径是基于output的

​ 当html直接不处于output所指定的目录下

outputPath:定义输出目录:静态资源最终被打包什么路径下

Base64编码

将file-loader 替换为url-loader(注意是替换)

npm i url-loader -D
{
  loader:'url-loader',
  options:{    
  		limit:10000, //都支持所有file-url的配置
  	}
}

limit:10000, 以10kb为界限规定是否要base64

如何处理字体文件

安装配置url-loader后,webpack就可以自动处理字体文件了

自定义字体图标 https://www.iconfont.cn/ https://icomoon.io

5 开发环境(开发服务器)

webpack-dev-server

区别:fis3可以启动服务,而webpack-dev-server不仅可以启动服务,还可以有webpack的功能

安装

npm install webpack-dev-server --save-dev

注意:不用引入 ,webpack-dev-server不会生成打包文件。其打包的所有资源都存在于内存中

配置:

devServer:{
	port:8080,           //指定服务器的端口
	host:"127.0.0.1"     //指定主机
}

运行:

在packafe.json中的script中配置
"scripts": {
  "server":"webpack-dev-server --open chrome"
}

功能:

自带功能:自动刷新–live reloading

完成以上配置后自带live reloading(自动刷新浏览器)

功能:即一修改代码会立刻重新编译 页面重新渲染

模块热更新(热模替换)

修改代码后进行局部更新,节省调试时间。并且可以保持应用的数据状态。

安装

npm install webpack --save-dev
webpack.HotModuleReplacementPlugin   :内置插件

引入

const webpack = require('webpack')   或者
内置插件可直接引入,用解构赋值
const {HotModuleReplacementPlugin} = require('webpack')

配置:

module.exports :{
   devServer:{
   port:3333,
   hot:true
} 

引入插件:服务与css

plguins: {
   new webpack.HotModuleReplacementPlugin()
}

注意:

  • 修改html不会触发模块热更新。我们只能手动刷新

  • 修改css会触发模块热更新,但这一切都依赖于style-loader

  • 原生js的模块热更新是需要开发者借助于API自己实现的。当然相应的框架(vue reat…)会有自身的配套插件。但原生js没有插件能够使其支持模块热更新。建议使用原生js开发时不要考虑使用模块热更新的功能

相关API:

  • ​ module.hot: 表示 [模块热替换(Hot Module Replacement)]是否启用

  • ​ module.hot.accept

​ module.hot.accept() 接受当前模块自身的更新

优化代码调试 (Source Map)

作用:优化调试。

安装:不需要任何安装

引入:不需要任何引入

配置:

module.exports: {
	devtool:'inline-source-map'
}

强约束Eslint

安装:

npm i eslint eslint-loader eslint-friendly-formatter -D

eslint-friendly-formatter: 报错时友好的输出模式

module:{
    rules:{
        {
        loader:'eslint-loader',
        options:{
        formatter:require("eslint-friendly-formatter")
      }
    }
}

eslint-loader要放在babel-loader之前来处理 即配置位置要在后

devServer.overlay:使 eslint的报错信息打到浏览器上

 devServer:{
 	overlay:true
 } 

6 fis3 服务器

fis.baidu.com

安装

npm i fis3 -g

打开fis3静态资源服务器的根目录

fis3 server open

将资源发布到fis3静态资源服务器

fis3 release

启动fis3静态资源服务器

fis3 server start

清除fis3静态资源服务器的根目录

fis3 server clean

关闭fis3静态资源服务器

fis3 server stop

查阅

fis3 start -h
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值