webpack 5 带来的全新改变

安装 webpack-dev-server

npm install webpack-dev-server -D

在 webpack配置文件中配置服务:

devServer:{

port: 8080,

open: true,

},

启动区别

// weebpack 5"start": "webpack serve"

// weebpack 4"start": "webpack-dev-server"

资源模块处理

资源模块(asset module)是一种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外 loader。

在 webpack 5 之前,通常使用:

raw-loader 将文件导入为字符串

url-loader 将文件作为 data URI 内联到 bundle 中

file-loader 将文件发送到输出目录

资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loader:

asset/resource 发送一个站长博客单独的文件并导出 URL。之前通过使用 file-loader 实现。

asset/inline 导出一个资源的 data URI。之前通过使用 url-loader 实现。

asset/source 导出资源的源代码。之前通过使用 raw-loader 实现。

asset 在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用 url-loader,并且配置资源体积限制实现。

区别

// webpack 4module:{rules:[

{

test:/\.(png|jpg|gif)$/,

// 此处需要安装 url-loader file-loader loader:'url-loader',

options:{

// 小于 8KB 转 base64

limit:8*1024

}

}

]

},

// webpack 5 module:{rules:[{

test:/\.(png|jpg|gif)$/,

// 通用资源类型, 不需要安装 loader

type:'asset',

// 现在,webpack 将按照默认条件,自动地在 resource 和 inline 之间进行选择

// 小于 8kb 的文件,将会视为 inline 模块类型,否则会被视为 resource 模块类

// 自定义设置

// 小于 8KB 转 base64

parser:{

dataUrlCondition:{

maxSize:8*1024

}

}

}]

},

当在 webpack 5 中使用旧的 assets loader(如 file-loader/url-loader/raw-loader 等)和 asset 模块时,你可能想停止当前 asset 模块的处理,并再次启动处理,这可能会导致 asset 重复,你可以通过将 asset 模块的类型设置为 'javascript/auto' 来解决。

module.exports = {

module: {

rules: [

{

test: /\.(png|jpg|gif)$/i,

use: [

{

loader: 'url-loader',

options: {

limit: 8192,

}

},

],+       type: 'javascript/auto'

文件缓存

缓存生成的 webpack 模块和 chunk,来改善构建速度。cache 会在开发 模式被设置成 type: 'memory' 而且在 生产 模式 中被禁用。

cache: true 与 cache: { type: 'memory' } 配置作用一致。

传入 false 会禁用缓存

cache.type

cache.type 将 cache 类型设置成内存或者文件系统。

'memory' | 'filesystem'

memory 选项很简单,它会告诉 webpack 将内容存放在内存中并且不允许额外的配置;

filesystem 选项,使用文件缓存系统;

cacheDirectory

cacheDirectory 定义缓存目录, 默认为 node_modules/.cache/webpack 。

cache.cacheDirectory 选项仅当 cache.type 被设置成 filesystem 才可用。

// const path = require('path');

module.exports = {

//...

cache: {

type: 'filesystem',

// cacheDirectory: path.resolve(__dirname, '.temp_cache')

}

};

Tree Shaking

tree shaking 是一个术语,「通常用于描述移除 JavaScript 上下文中的未引用代码(dead-code)。」 它依赖于 ES2015 模块语法的 静态结构 特性,例如 import 和 export。这个术语和概念实际上是由 ES2015 模块打包工具 rollup 普及起来的。

const path = require('path');

module.exports = {

entry: './src/index.js',

output: {

filename: 'bundle.js',

path: path.resolve(__dirname, 'dist'),

},

// production、development、none

// production 生产环境,默认优化打包

// none 不做任何操作

mode: 'development',

optimization: {

usedExports: true, // usedExports:true 开启优化(树摇但保留代码)

minimize:true, // minimize:true 开启压缩 (删除未使用代码)

// sideEffects 将文件标志为副作用

},

};

模块联邦

Webpack5 模块联邦让 Webpack 达到了线上 Runtime 的效果,让代码直接在项目间利用 CDN 直接共享,不再需要本地安装 Npm 包、构建再发布了!

这通常被称作微前端,但并不仅限于此;

src/index.js

import React from 'react';import ReactDom from 'react-dom';import App from './App';

ReactDom.render(<App />, document.getElementById('root'));

src/App.js

import React from 'react';import User from './User';

const App = () => {

return (

<div>

这是 app

<User />

</div>

);

}

export default App;

src/User.js

import React from 'react';

const User = () => {

return (<div>用户列表</div>);

}

export default User;

导出模块

const ModuleFederationPlugin = require('webpack').container.ModuleFederationPlugin;

module.exports = {

// ...

plugins: [

new ModuleFederationPlugin({

// 模块名字

name: 'remote', // 导入时需要使用的名称标注

filename: 'remoteEntry.js', // 编译后的模块文件名,导入时使用

// 导出模块 关键字与模块名

exposes: {

// key 导入时使用的关键字:对应模块文件

'./User': './src/User.js',

}

})

],

// ...

};

导入模块

const ModuleFederationPlugin = require('webpack').container.ModuleFederationPlugin;

module.exports = {

// ...

plugins: [

new ModuleFederationPlugin({

name: 'remoteFile',

// 导入外部模块

remotes: {

// 导入别名:关键字@地址/导出文件名

remoteHost: 'remote@http://127.0.0.1:3004/remoteEntry.js'

}

})

],

// ...

};

import React from 'react';const User = React.lazy(() => import("remoteHost/User"))

const App = () => {

return (

<div>

这是 app

<React.Suspense fallback="正在加载...">

<User />

</React.Suspense>

</div>

);

}

export default App;

(0)

相关推荐

  • 运动可以带来意想不到的行为改变

    运动的益处多多,比如减肥.身体塑形.愉悦身心,还可以降低糖尿病.中风.心脏病等疾病的发病率.而最近有研究发现,运动还可以带来更多积极的行为,比如更乐于主动进行有意义的社交. 乔治梅森大学的研究团队,招 ...

  • 细数微程科技给智慧数字经营带来的那些改变

    数字化经营如同潮流般涌入各行各业,改变了门店的经营模式,也改变了门店经营状况.很多商家还在抱怨疫情是导致关门潮罪魁祸首的时候,殊不知,很多商家通过智慧数字经营转型已经赚的盆满钵满,所以传统经营思维不可 ...

  • 云测推广:App Store运营推广为流量获取带来了哪些改变?

    导语: 在整个手游行业里,其实很多人对App Store运营推广都没有太多认知,实际上在苹果商店如日中天的当下,65%以上的用户是通过搜索关键词来下载APP,所以基于App Store运营推广优化而推 ...

  • 伦敦城市再造计划 为原本没落的区域带来怎么样的改变呢?

    Regeneration areas in London 近年来伦敦各区都在进行大大小小的城市再造计划,而此再造计划对于房地产投资者来说也是非常重要的因素之一,很多人可能会质疑伦敦的城市再造计划到底是 ...

  • 这 7 本书,真正给我的生活带来了长期改变

    神译局是36氪旗下编译团队,关注科技.商业.职场.生活等领域,重点介绍国外的新技术.新观点.新风向. 编者按:读过的书要真的对自己的生活有所改变,才算是一本好书.本文作者列出了长期影响自己生活的7本书 ...

  • 一次静坐带来的全新体验 长期...

    一次静坐带来的全新体验 长期坚持静坐,2009年一次半夜打坐,按照"心如幻者,亦复远离.远离为幻,亦复远离.离远离幻,亦复远离.得无所离,即除诸幻." 这个办法来观照自心,每生起一 ...

  • 水泥漏粪板的使用为养殖场带来了哪些改变

    说到养殖场的环境,联想起来可能都是些难闻的气味,有着不好的印象,事实也确实如此,但是随着现代化养殖场的发展,开始利用一些养殖设备来改变养殖场的环境卫生,比较常见的养殖设备就是水泥漏粪板了,你知道水泥漏 ...

  • 跑步带来最大的改变不是瘦身,而是这些......

    跑步早已成为简单易行的国民运动,无论你在公园.操场.河边和马路上,或者是在小区的花园.家里的跑步机上,都能够自由的迈开双腿跑起来. 而我们也从最初开始跑步时的3公里便彻底放弃,到逐渐10公里的轻松自如 ...

  • ​坚持写作带来的一些改变

    很幸运在今年找到了写作这个朋友,让我每天的情感有地方抒发,每天的思考有方式整理,对生活多了一些观察,而对每一天的记录,又让生活多了一份意义,每一天也开始变得不同. 我想,我们的内在都是互相联系和影响的 ...