webpack4进阶配置

移动端CSS px自动转换成rem

需要两步来实现:

  1. px2rem-loader 在构建阶段将px转换成rem
  2. lib-flexible 页面渲染时动态计算根元素的font-size值(手机淘宝开源库)

下载插件并配置:

npm i px2rem-loader lib-flexiblemodule: {rules: [{test: /\.less$/,use: [MiniCssExtractPlugin.loader, "css-loader",{loader: "postcss-loader",...},{loader: "px2rem-loader",options: {remUnit: 75,remPrecision: 8}},"less-loader",]},]
},

然后,需要将淘宝的插件的内联在html文件中:

<script src='../node_modules/lib-flexible/flexible.js'></script>

静态资源内联

静态资源内联是指将CSS、JS等静态文件中的内容抽离出来,内联到html中。我们之前借助插件做到了将内联的资源独立成文件,为什么还要将资源内联呢?

资源内联的意义:

  • 代码层面:
  1. 页面框架的初始化脚本(这些脚本往往需要在第一时间加载,多将其写在<head>中)
  2. 上报相关打点
  3. CSS内联避免页面闪动
  4. HTML可以动态地将不同的meta标签内联进来
  • 请求层面:
  1. 减少http请求

HTML和JS内联

使用raw-loader,注意要使用0.5的版本,新版本的存在一些问题。

npm i raw-loader@0.5.1/src/meta.html 【例:腾讯NOW直播官网的meta标签】
<meta charset="UTF-8">
<meta name="viewport" content="viewport-fit=cover,width=device-width,initial-scale=1,user-scalable=no">
<meta name="format-detection" content="telephone=no">
<meta name="keywords" content="now,now直播,直播,腾讯直播,QQ直播,美女直播,附近直播,才艺直播,小视频,个人直播,美女视频,在线直播,手机直播">
<meta name="name" itemprop="name" content="NOW直播—腾讯旗下全民视频社交直播平台">
<meta name="description" itemprop="description" content="NOW直播,腾讯旗下全民高清视频直播平台,汇集中外大咖,最in网红,草根偶像,明星艺人,校花,小鲜肉,逗逼段子手,各类美食、音乐、旅游、时尚、健身达人与你24小时不间断互动直播,各种奇葩刺激的直播玩法,让你跃跃欲试,你会发现,原来人人都可以当主播赚钱!">
<meta name="image" itemprop="image" content="https://pub.idqqimg.com/pc/misc/files/20170831/60b60446e34b40b98fa26afcc62a5f74.jpg">
<meta name="baidu-site-verification" content="G4ovcyX25V">
<meta name="apple-mobile-web-app-capable" content="no">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">/node_modules/lib-flexible/flexible.js 【npm下载的淘宝库】/src/index.html
<!DOCTYPE html>
<html lang="en">
<head>${ require('raw-loader!./meta/meta.html') }<title>Hello Webpack</title><script>${ require('raw-loader!babel-loader!../node_modules/lib-flexible/flexible.js') }</script> <!-- 先用raw-loader内联,再用babel-laoder转换语法 -->
</head>
<body>
<div id="root"></div>
</body>
</html>

CSS内联

借助style-loader即可

{loader: 'style-loader',options: {insertAt: 'top', // 样式插入到<head>singleton: true, // 将所有style标签合并成一个}
}

多页面应用打包方案

每当增加一个页面,我们就手动地在webapck配置中对应增加一个entry、html-webpack-plugin。

一定可以有更优的方案,那就是:动态获取entry的数量、然后自动生成html-webpack-plugin。

需要借助glob.sync,可以在每次构建的时候获取页面的数量。这需要我们规范目录,将每个页面(文件夹)都放在src文件夹下,每个页面(文件夹)入口文件是index.js,入口页面是index.html。

npm i globconst glob = require('glob');const setMPA = () => {let entry = {};let htmlWebpackPlugins = []; const entryFiles = glob.sync(path.join(__dirname, './src/*/index.js')); // 获取所有页面的入口文件路径。entryFiles是所有页面index.js的绝对路径形成的数组entryFiles.forEach((file)=>{let name = file.match(/src\/(.*)\/index\.js/);let pageName = name && name[1];entry[pageName] = file;htmlWebpackPlugins.push(new HtmlWebpackPlugin({template: file.replace("index.js","index.html"),filename: `${pageName}.html`,chunks: [`${pageName}`],inject: true,minify: {html5: true,collapseWhitespace: true,preserveLineBreaks: false,minifyCSS: true,minifyJS: true,removeComments: true,},}))});return {entry,htmlWebpackPlugins}
};const result = setMPA();module.exports = {entry: result.entry,output: {filename: "bundle[chunkhash:8].js",path: path.join(__dirname, "/dist")},mode: 'production',module: {rules: [...]},plugins: [...result.htmlWebpackPlugins, // 将N个HtmlWebpackPlugin对象插入列表new MiniCssExtractPlugin({filename: '[name][contenthash:8].css'}),new OptimizeCssAssetsPlugin({assetNameRegExp: /\.css$/g,cssProcessor: require('cssnano'),}),new CleanWebpackPlugin(),
};

使用Source Map

什么是source map?顾名思义,就是代码地图,可以将构建前后的两份代码做一个映射。

sourcemap的作用:构建后的代码已经变了模样,没有可读性,开发调试的时候无法定位问题所在。sourcemap的存在可以直接将问题定位到源代码,排查问题。

配置文件中devtool属性可以设置,有非常多的类型可选,一般情况下,开发环境使用"source-map",生产环境关闭。

module.exports = {devtool: "source-map"
};

代码分割

对于大型的web应用来说,将所有的代码编译成一个文件显示不好,会造成文件体积过大以及需要加载大量与首屏无关的代码,用户体验不好。webpack提供将代码分割成chunk(语块),当代码运行到需要的它们的时候再进行加载。

代码分割有两种类型:

  • 抽离公共资源。(比如基础库入React/Vue,React-Router/Vue-Router。或者自己编写的公共模块)
  • JS懒加载,使得初始状态下的代码更小(首屏优化)

抽离公共资源

需要借助插件,有两个插件可供选择:html-webpack-externals-plugin 和 SplitChunsPlugin(webpack4内置,代替webpack3的CommonsChunkPlugin)

说明:

  • 两个插件不要混用
  • html-webpack-externals-plugin既可以将本地基础库分离,也可以直接使用CDN。本人试图将本地库进行分离,总是失败,暂没查明原因。
  • 使用SplitChunksPlugin中chunks时,如果没有使用异步加载,chunks建议"all",但如果使用了异步加载,"all"则会导致错误,这时建议用"initial"

html-webpack-externals-plugin:

npm i html-webpack-externals-pluginconst HtmlWebpackExternalsPlugin = require('html-webpack-externals-plugin');plugins: [new HtmlWebpackExternalsPlugin({externals: [{module: "react", // 代码中引入的库的名称entry: "https://11.url.cn/now/lib/16.2.0/react.min.js",// entry: "cjs/react", // 相对于node_modules/react的路径【官网示例,实际并不成功】global: "React", // 代码中引入的库的全局对象的名称},{module: "react-dom",entry: "https://11.url.cn/now/lib/16.2.0/react-dom.min.js",// entry: "dist/react-dom", // 相对于node_modules/react-dom的路径 【官网示例,实际并不成功】global: "ReactDOM",},],})
]

SplitChunksPlugin:

module.exports = {optimization: {splitChunks: {minSize: 0, // 分离包体积的最小大小cacheGroups: {commons: {// test: /(react|react-dom)/,  // 通过正则匹配,只分离react/react-dom这两个库,不写test则不作限制name: 'commonss',  // 分离块的名称,需要加在HtmlWebpackPlugin插件的chunks属性中,才能正确命名分离后的文件chunks: "all", // 需要分割哪些代码块,all表示所有代码块,async按需加载的代码块,initial初始化代码块// minChunks: 2, // 最小引用次数,少于这个引用次数就不会单独提取出来}}}}
};

JS懒加载

实现懒加载不需要对webpack配置,动态引入import('')语法还没有成为JS标准(也许不久的将来会),目前要借助js插件

实现懒加载:

  • 如果使用的CommonJS,直接require.ensure即可
  • 如果使用ES6模块化,需要借助第三方插件实现。(babel插件@babel/plugin-syntax-dynamic-import,且在.babelrc文件内配置)
npm i @babel/plugin-syntax-dynamic-import.babelrc
{"presets": ["@babel/preset-react","@babel/preset-env"],"plugins": ["@babel/plugin-syntax-dynamic-import",  // 懒加载插件"@babel/plugin-proposal-class-properties"]
}

在此基础上,如果使用React开发项目,还可以使用react-loadable插件来更好的实现异步加载

npm i react-loadableindex.js中部分代码import Loadable from "react-loadable";
const TextLoad = Loadable({loader: () => import(/* webpackChunkName: 'text' */    './text'), // 通过注释的方式指定打包后的chunk的名字loading: ()=> <div>正在加载</div>
});class Search extends React.Component{constructor(props){super(props);this.state = {text: false,};}loadComponent = () => {this.setState({text: true})};render() {const { text } = this.state;return (<><div>你好,显示字体 Hello Webpacks</div>{text ? <TextLoad /> : null}<img alt="" src={logo} style={{ width: 100 }} onClick={this.loadComponent}/></>)}
}export default Search;

tree shaking(摇树优化)

一个文件会有多个方法、对象、语句,只要用到其中一小部分,便会将整个文件内的所有内容打包进去。tree shaking只把用到的方法打包进去,没用到的会在uglfiy阶段被擦出掉。

使用:webpack默认支持,生产环境默认开启

要求:必须是ES6的写法,CommonJS的方式不支持

Scope Hoisting

构建之后的代码存在大量闭包,导致:

  • 文件体积增大
  • 运行代码时创建的函数作用于变多,内存开销变大

scope hoisting就是减少闭包函数的声明。

原理:将所有模块的代码按照引用顺序放在一个函数作用域里,然后适当地重命名一些变量以防止变量名冲突,以此减少闭包函数声明代码。

使用:webpack默认支持,生产环境默认开启

要求:必须是ES6写法,CommonJS的方式不支持

优化构件时命令行的显示日志

每次构建,命令行输出大量日志,有很多是我们完全不关心的,想要优化它,可以在webpack中设置state属性。

// 如果是打包,在最外层的state属性
module.exports = {stats: 'errors-only',
};
// 如果是devserver热更新
const devConfig = {devServer: {contentBase: './dist',hot: true,stats: 'errors-only', },
};

state的取值有:

  • errors-only  只发生错误时输出
  • minimal       只发生错误或有新的编译时输出
  • none       没有输出
  • normal         标准输出
  • verbose       全部输出

我们希望是在发生错误的时候输出,当state为error-only时,如果没有错误,没有任何输出,不太友好。

借助插件:friendly-errors-webpack-plugin。此时将state设置成errors-only

npm i friendly-errors-webpack-pluginconst FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin');
module.exports = {plugins: [new FriendlyErrorsWebpackPlugin(),],
};

 

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1jot771valo8l

 

转载于:https://www.cnblogs.com/V587Chinese/p/11571515.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MBR与GPT的区别

由于在服务器上装windows系统&#xff0c;一共有3个4T的硬盘&#xff0c;但是在windows系统下最大显示的为7T&#xff0c;这是因为3个4T硬盘做了Raid5&#xff0c;即&#xff1a;3.6Tx&#xff08;3-1&#xff09; 7T,大约是7T。由于单个移动硬盘大于2T&#xff0c;而MBR格式的…

Servlet-三大域对象

request request是表示一个请求&#xff0c;只要发出一个请求就会创建一个request&#xff0c;它的作用域&#xff1a;仅在当前请求中有效。用处&#xff1a;常用于服务器间同一请求不同页面之间的参数传递&#xff0c;常应用于表单的控件值传递。常用方法&#xff1a;request.…

装windows和Linux系统时找不到硬盘,pe安装系统没有出现磁盘,不能识别磁盘

装win7的时候&#xff0c;我们使用U盘装系统&#xff0c;找不到硬盘&#xff0c; 或者使用光盘装系统时 会出现 缺少所需的CD/DVD驱动器设备驱动程序 然后找遍整个硬盘/光盘也找不到合适的驱动&#xff0c;安装无法继续。 解决方法&#xff1a; ACHI模式下&#xff0c;PE里…

JSP四大域对象与九大内置对象

域对象的作用:保存数据,获取数据,共享数据.page&#xff1a;jsp页面被执行&#xff0c;生命周期开始&#xff0c;jsp页面执行完毕&#xff0c;生命周期结束&#xff08;jsp当前页面有效&#xff09;request&#xff1a;用户发送一个请求&#xff0c;生命周期开始&#xff0c;服…

解决ubuntu 15.04 安装matlab后无法找到matlab执行文件的问题

在ubuntu 15.04上安装好maltab R2015b之后&#xff0c;进入文件夹&#xff1a; /usr/local/MATLAB/R2015b/bin 没有发现matlab可执行文件&#xff0c;可是在文件管理器中又能搜索到matlab文件&#xff0c;是在其子目录glnxa64下。但进入子目录后&#xff0c;在终端输入命令&a…

一个写得很不错的vuex详解(转)

https://segmentfault.com/a/1190000015782272?utm_sourcetag-newest 转载于:https://www.cnblogs.com/hj0711/p/11577582.html

Linux 服务器上建立用户并分配权限

查看用户 whoami #要查看当前登录用户的用户名 who am i #表示打开当前伪终端的用户的用户名 who mom likes who 命令其它常用参数 参数 说明 -a 打印能打印的全部 -d 打印死掉的进程 -m 同am i,mom likes -q 打印当前登录用户数及用户名 -u 打印当前登录用户登录信…

HttpServletRequest

HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求&#xff0c;当客户端通过HTTP协议访问服务器时&#xff0c;HTTP请求头中的所有信息都封装在这个对象中&#xff0c;通过这个对象提供的方法&#xff0c;可以获得客户端请求的所有信息。 二、Request常用方法 2.…

Linux 释放cpugpu内存、显存和硬盘

free -m free -mtotal used free shared buff/cache available Mem: 128831 15666 23617 406 89547 111448 Swap: 130986 130977 9 total 内存总数 used 已经使用的内存数 free 空闲…

POS时机未到,POW强攻是实现全球货币的正确道路

POS时机未到&#xff0c;POW强攻是实现全球货币的正确道路 取代现今的货币体系的正确进攻方式是POW强攻&#xff0c;现在的货币是由力量背书的&#xff0c;以后的货币也是由力量背书的&#xff0c;只有因造币耗费的力量超过了所有其它力量的时候才能取代成功&#xff0c;才能消…

Ubuntu15.04 64位安装Theano(已经测试可执行)

备注&#xff1a;之前服务器上已经安装caffe&#xff0c;后安装Theano&#xff0c;所有有些步骤简略。 安装caffe详情见 Caffe Ubuntu 15.04 CUDA 7.5 在服务器上安装配置及卸载重新安装&#xff08;已测试可执行&#xff09; 安装所需的安装包见 链接: http://pan.baid…

跳槽时,不敢要高工资也会对候选人不利

我在做技术面试官的时候&#xff0c;在问完问题后&#xff0c;照例会问一句&#xff1a;你期望的工资是多少&#xff1f;对此&#xff0c;我只会记录下候选人的回答然后上报&#xff0c;没有同意权&#xff0c;更没有批驳权。 判断候选人能否通过面试&#xff0c;主要看候选人能…

ubuntu 15.04 下的 nvidia(待续)

检查自己的GPU是否支持CUDA&#xff0c;linux可用以下命令来查看GPU型号&#xff1a; lspci | grep –i nvidia 本机显示结果如下 03:00.0 3D controller: NVIDIA Corporation GK110BGL [Tesla K40c] (rev a1) 04:00.0 VGA compatible controller: NVIDIA Corporation GK110…

LSTM

具体推导公式为&#xff1a; https://zybuluo.com/hanbingtao/note/581764 转载于:https://www.cnblogs.com/invisible2/p/11593270.html

查看windows显卡内存详细信息

方式一&#xff1a; 打开运行&#xff08;WindowsR&#xff09;&#xff0c;输入DXDIAG&#xff0c;打开DirectX诊断工具 可以看到显卡是AMD Radeon HD 7000 series&#xff0c;但是没有具体显卡信息&#xff0c;这个型号是AMD在2013年主推的ATI的入门级独显系列&#xff0c;其…

会话技术CookieSession

1&#xff0e;会话技术 从打开一个浏览器访问某个站点&#xff0c;到关闭这个浏览器的整个过程&#xff0c;成为一次会话。会 话技术就是记录这次会话中客户端态的状与数据的。 会话技术分为Cookie和Session&#xff1a; Cookie&#xff1a;数据存储在客户端本地&#xff0…

从服务器上传和下载文件方法

1. ssh 安装SSH Secure Shell Client客户端 下载链接 http://download.csdn.net/detail/jiandanjinxin/9755684 使用方法参考主页 http://www.cnblogs.com/wxjnew/archive/2013/06/05/3118808.html http://www.cnblogs.com/pingzhanga/p/5126885.html 导致此问题的原因是…

动态页面技术(JSP/EL/JSTL)

1 JSP技术1.1 jsp脚本和注释jsp脚本&#xff1a;  1) <%java代码%> ----- 内部的java代码翻译到service方法的内部  2) <%java变量或表达式> ----- 会被翻译成service方法内部out.print()  3) <%!java代码%> ---- 会被翻译成servlet的成员的内容jsp…

Deep Learning运行所需的硬件配置(转)

A Full Hardware Guide to Deep Learning 2015-03-09 by Tim Dettmers 304 Comments 转自&#xff1a;http://timdettmers.com/2015/03/09/deep-learning-hardware-guide/ Deep Learning is very computationally intensive, so you will need a fast CPU with many cores, ri…

DBUtils

概述 DBUtils是Java编程中的数据库操作实用工具&#xff0c;小巧简单实用。 DBUtils封装了对JDBC的操作&#xff0c;简化了JDBC操作&#xff0c;可以少写代码。 DBUtils三个核心功能介绍 QueryRunner中提供对sql语句操作的APIResultSetHandler接口&#xff0c;用于定义select操…