当前位置: 首页 > wzjs >正文

手机网站的推广2021网络营销成功案例

手机网站的推广,2021网络营销成功案例,软件设计的过程,php js做网站一. webpack打包流程 开发 Webpack 插件的第一步,就是明确:我的插件要接入 Webpack 构建流程的哪个阶段,解决什么问题。 了解流程之前首先要了解插件的两个核心概念:compiler,compilation 1. compiler:全局…

一. webpack打包流程

开发 Webpack 插件的第一步,就是明确:我的插件要接入 Webpack 构建流程的哪个阶段,解决什么问题。

  • 了解流程之前首先要了解插件的两个核心概念:compilercompilation
1. compiler:全局构建控制器
你可以这样理解它:
  • 是 Webpack 的“大脑”,负责整个构建流程
  • 只会在整个 Webpack 启动时创建一次
  • 提供入口:如 compiler.hooks.compile、compiler.hooks.run 等

注册插件

class MyPlugin {apply(compiler) {// 插件注册时调用一次}
}

使用钩子

compiler.hooks.beforeRun.tap('MyPlugin', () => { ... })
2. compilation:本次构建上下文
你可以这样理解它:
  • 是每次构建过程中的“局部快照”
  • 管理模块 (module)、代码块 (chunk)、资源 (asset)等
  • 在监听模式或热更新时,每次都会重新生成一个 compilation 实例

你要修改文件,生成资源,访问chunk的时候,一定是在 compilation 阶段完成的

compiler.hooks.thisCompilation.tap('MyPlugin', (compilation) => {// compilation 是这一次构建的上下文compilation.hooks.buildModule.tap(...)compilation.hooks.processAssets.tap(...)
});
举个例子
class FileListPlugin {apply(compiler) {// 第一次执行,仅执行一次,注册插件钩子compiler.hooks.thisCompilation.tap('FileListPlugin', (compilation) => {// 每次构建及热更新都会触发compilation.hooks.processAssets.tap({name: 'FileListPlugin',stage: compilation.constructor.PROCESS_ASSETS_STAGE_SUMMARIZE},() => {const files = Object.keys(compilation.assets).join('\n');compilation.emitAsset('filelist.md', new compiler.webpack.sources.RawSource(files));});});}
}
webpack打包流程
阶段对应方法插件钩子说明
1️⃣ 初始化webpack() 创建 compilercompiler.hooks.environment读取配置、初始化插件
2️⃣ 编译开始compiler.run()compiler.hooks.beforeRunruncompile启动构建,调用编译
3️⃣ 创建 Compilationnew Compilation()thisCompilationcompilation代表一次构建,管理模块、资源
4️⃣ 构建模块buildModule/handleModuleCreationcompilation.hooks.buildModule构建入口与递归依赖
5️⃣ 完成模块seal()sealoptimizeModules完成依赖分析与模块关系确定
6️⃣ 生成代码块createChunkGraph()optimizeChunks把模块打成 chunk
7️⃣ 生成资源emitAssets()processAssets将 chunk 渲染为文件(此时文件还在内存中)
8️⃣ 输出结果outputFileSystem.writeFileafterEmitdone写入磁盘,构建完成

二. 插件的开发

1. 插件的基本结构
class MyPlugin {constructor(options) {this.options = options;}// 创建插件类并实现 apply(compiler) 方法apply(compiler) {// 注册 compiler 生命周期钩子compiler.hooks.thisCompilation.tap('MyPlugin', (compilation) => {// 注册 compilation 生命周期钩子compilation.hooks.processAssets.tap({name: 'MyPlugin',stage: compilation.constructor.PROCESS_ASSETS_STAGE_SUMMARIZE},(assets) => {const { RawSource } = compiler.webpack.sources;// 修改、添加资源const content = 'hello plugin';compilation.emitAsset('my-output.txt', new RawSource(content));});});}
}module.exports = MyPlugin;
  • stage 是一个数字,标识你要插入的逻辑在整个资源处理生命周期中的阶段优先级
  • PROCESS_ASSETS_STAGE_SUMMARIZE的stage为7000,代表总结阶段,可以做输出文件列表、日志、清单等操作
  • 其他更多的stage可以翻阅webpack官网查看
2. 注册钩子的方法
tap: 同步钩子
compiler.hooks.beforeRun.tap('MyPlugin', (compiler) => {console.log('Before run');
});
tapAsync:异步钩子(使用回调)
compiler.hooks.beforeRun.tapAsync('MyPlugin', (compiler, callback) => {setTimeout(() => {console.log('Before run (async)');callback();}, 1000);
});
  • 用于需要手动处理异步任务的情况,必须调用 callback()
tapPromise:异步钩子(使用 Promise)
compiler.hooks.beforeRun.tapPromise('MyPlugin', (compiler) => {return new Promise((resolve) => {setTimeout(() => {console.log('Before run (promise)');resolve();}, 1000);});
});
  • 推荐用于现代异步开发场景

三. 利用webpack插件实现上线后热更新的功能

1. 构建完成后自动生成一个带 hash 的版本号文件
class VersionFilePlugin {constructor(options = {}) {this.filename = options.filename || 'version.txt';}apply(compiler) {compiler.hooks.thisCompilation.tap('VersionFilePlugin', (compilation) => {const { RawSource } = compiler.webpack.sources;compilation.hooks.processAssets.tap({name: 'VersionFilePlugin',stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS},() => {// 获取当前构建 hashconst hash = compilation.fullHash;const content = `version: ${hash}`;// 添加 version.txt 文件compilation.emitAsset(this.filename, new RawSource(content));});});}
}module.exports = VersionFilePlugin;
注册插件
const VersionFilePlugin = require('./plugins/VersionFilePlugin');module.exports = {// ...plugins: [new VersionFilePlugin({filename: 'version.txt'})]
};
2. 定时轮询 version.txt,检测 hash 是否变化
<script>
(function () {const VERSION_CHECK_INTERVAL = 1000 * 60 * 5; // 每 5 分钟检查一次const VERSION_URL = '/version.txt';let currentVersion = null;async function checkVersion() {try {const res = await fetch(VERSION_URL, { cache: 'no-store' });const text = await res.text();const latestVersion = text.trim().split('version: ')[1];if (currentVersion && latestVersion !== currentVersion) {console.warn('[version check] 新版本已发布,自动刷新页面');location.reload(true); // 强制刷新页面}currentVersion = latestVersion;} catch (err) {console.error('[version check] 检查失败:', err);}}// 初始加载checkVersion();// 定时检查setInterval(checkVersion, VERSION_CHECK_INTERVAL);
})();
</script>

⚠️ 需要将该文件一并部署到 Web 服务器根目录

有好多全局构建的生命周期钩子每次构建生成的模块、资源、chunk 等上下文生命周期钩子本文没有展示,想了解更多的可以去看下webpack官方文档

http://www.dtcms.com/wzjs/285154.html

相关文章:

  • 那个网站可以做图标百度怎么推广产品
  • 网站空间哪家做的好制作链接的app的软件
  • 成都手机模板建站推广赚钱的微信小程序
  • wordpress url自定义萧山市seo关键词排名
  • 实用网站推荐灰色词快速排名方法
  • 宜兴网站制作品牌网络推广外包
  • 云南网首页天津seo诊断
  • 做业务网站湖南有实力seo优化哪家好
  • 做网站第一步要学什么百度广告代理
  • 免费数据源网站加速游戏流畅的软件
  • 中山最好的网站建设小红书搜索优化
  • 电子商城市场广告优化师适合女生吗
  • 建站的平台网站建设优化哪家公司好
  • SEO网站链接模型今天发生的重大新闻事件
  • 专业网站推荐福建百度代理公司
  • 县城做信息网站赚不赚钱河北网站优化公司
  • 做非遗网站的原因关键词优化师
  • wordpress网站乱码南宁seo优化
  • 摄影手机网站模板海南网站设计
  • 网站主体负责人全球十大搜索引擎入口
  • 做网站不推广江阴网站制作公司
  • 网站店铺的图片怎么做的优化公司流程制度
  • 闵行西安网站建设百度网盟推广官方网站
  • wap站开发十种营销方式
  • 建设通网站上的业绩能否删除掉seo网站搜索优化
  • 网站规划与建设 ppt优化课程体系
  • 签到 做任务赚钱的网站永久免费的网站服务器有哪些软件
  • 珠海市网站开发公司宁波seo怎么做引流推广
  • 网站建设需要的费用百度精简版入口
  • vi设计公司哪里四川seo整站优化费用