热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何优化自己的html项目,【webpack篇】工程化里,如何优化自己的项目

写在前面因为业务关系,涉及到的新老业务较多。因此接触过webpack早期与后期的阶段。以及vue-cli2、3、4我们现在已经在使用vue-cli4了老生常谈的几个优

写在前面

因为业务关系,涉及到的新老业务较多。因此接触过webpack早期与后期的阶段。

以及vue-cli2、3、4

我们现在已经在使用vue-cli4了

老生常谈的几个优化操作

Dll

剥离公用资源

如何使用(vue-li3、4)的小伙伴可以看以下

先将dll配置文件写好

webpack.dll.config.js

const path = require('path');

const webpack = require('webpack');

const CopyWebpackPlugin = require('copy-webpack-plugin');

const utils = require('../config/utils');

const packageSysName = require('../package.json').name;

// 这个操作是获取name,打包的时候植入自己的对应的系统 可删除

const sysName = utils.getSystemName(packageSysName);

// 这个操作是获取name,打包的时候植入自己的对应的系统 可删除

const resolve = dir => path.join(__dirname, '..', dir);

module.exports = {

entry: {

vue: ['vue', 'vuex', 'vue-router', 'axios'],

ec: ['echarts'],

utils: ['moment'],

ui: ['element-ui']

},

// devtool:'source-map',

output: {

path: path.join(__dirname, '..', 'public/vendor'),

filename: '[name].dll.js',

library: '[name]_[hash]'

},

plugins: [

new webpack.DllPlugin({

path: path.join(__dirname, '..', 'public/vendor', '[name]-manifest.json'),

name: '[name]_[hash]',

context: process.cwd()

}),

new CopyWebpackPlugin([{

from: resolve('./public/vendor'),

to: resolve(`./dist/resources/${sysName}/assets/vendor`),

toType: 'dir'

}])

],

resolve: {

alias: {

vue$: 'vue/dist/vue.esm.js'

}

}

};

引入此配置文件于vue.config.js中(vue-cli3、4)

dllEntry.forEach(dll => {

result.push(`resources/${sysName}/assets/vendor/${dll}.dll.js`)

});

if (IS_PROD) {

Object.keys(externalsMaps.map).forEach(exter => {

const {

name,

version

} = externalsMaps.map[exter];

result.push(`${name}/v${version}/${name}.js`);

result.push(`${name}/v${version}/${name}.css`);

});

}

return result;

最后使用 html-webpack-tags-plugin 此插件

对其生成的文件在编译过程中自动插入html文件中

静态资源的处理

将css资源单独打包

以下提供案例是webpack 4.39.2的

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

new MiniCssExtractPlugin({

// Options similar to the same options in webpackOptions.output

// all options are optional

filename: `${name}.css`,

chunkFilename: '[name].chunk.css'

});

//loader部分

{

test: /\.scss$/,

use: [{

loader: MiniCssExtractPlugin.loader,

options: {

hmr: process.env.NODE_ENV === 'development'

}

},

'css-loader',

'postcss-loader',

'sass-loader'

]

}

img

图片文件我们分为几个策略

一般的icon以及小文件,使用svg-sprite的模式进行打包。svg可以改变颜色,这在icon里是十分好用的,因为icon大多都有不同的状态。

以下提供案例依旧是vue-cli4的

config.module

.rule("images")

.test(/\.(svg|png|jpe?g|gif|webp)(\?.*)?$/)

.exclude

.add(resolve('src/assets/image/icons'))

.add(resolve('src/components/menu/icon'))

.add(resolve('src/assets/image/crmMonitor/process'))

.end()

.use('url-loader')

.tap(options => merge(options, {

limit: 8192, //限制图片大小,小的图片将转化为base64

fallback: {

loader: 'file-loader',

options: {

name: IS_PROD ? `${staticResource}/img/[name].[ext]` : `img/[name].[ext]`

}

}

}));

config.module

.rule('svg-sprite-loader')

.test(/\.svg$/)

.include

.add(resolve('src/assets/image/icons')) //处理svg目录

.add(resolve('src/components/menu/icon'))

.add(resolve('src/assets/image/crmMonitor/process'))

.end()

.use('svg-sprite-loader')

.loader('svg-sprite-loader')

.options({

symbolId: 'icon-[name]'

});

externals

大部分会使用cdn。但是因为我手下的项目都是局域网项目:)

但也难不倒我这样的小天才

因为我在部门内开发了前端类用库。而这部分的库有很多版本迭代以及多人使用。且部分组件是应该按需加载的。

我将其打包到服务器上后,提供了地址(并在其中打上版本号),并用nginx将其拦截转发。

于是此时,我的fake cdn就出现了。

结合dll,与prefetch,preload(什么是prefetch、preload,争取下一篇提及一下。好东西。)可以按需加载。

具体代码下一章来吧~~~

eslint、 gzip、mock(hmr)

eslint

短话短说,语法检查,组内使用的是airbnb的语法。

如何配置?

根目录下=》 .eslintrc.js

参考配置

gzip

直接上vue-cli3、4的代码

config.plugin('compress').use(CompressionWebpackPlugin, [{

algorithm: 'gzip',

test: new RegExp(`\\.(${productionGzipExtensions.join('|')})$`),

threshold: 10240,

minRatio: 0.8,

}])

也可以使用uglifyjs-webpack-plugin

mock

我们使用过express的中间件转发,也使用过webpack-middle-proxy,以及mock.js

但是都不满足我们的需求,首先他要先满足能够hmr(热更新),最好能直接读取json,懒

后来我们选用了mocker-api,比较合适于resetful的接口模式

废话

其实工程化我使用过gulp、webpack两个脚手架。

gulp是比较简单易上手的,所以简单的项目,比如只是简单gzip后使用的js,就会使用gulp。他的pipe链条模式印象深刻。webpackChain有点这个意思。

下一篇会详细说下自己写loader plugin的时候遇到的问题



推荐阅读
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
author-avatar
glh3112259
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有