如何提升项目的本地构建效率?

这篇具有很好参考价值的文章主要介绍了如何提升项目的本地构建效率?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近写H5的项目比较多,该项目从年龄上看着还算比较年轻😂,整个架构应该是直接使用vue-cli基于vue2生成的,那底层打包工具自然也就是webpack,我们知道webpack有个通病,那就是随着项目的不断增大每次构建的时间也会随之越来越长。比如我们这个项目的单次冷启动就达到了惊人的1分20秒左右,每次跑完电脑风扇转的飞起,简直忍不了!(可能是电脑太老了)

下面一起看看如何将项目的冷启动时长从1分20秒左右优化到十几秒左右吧~

是什么让构建效率这么慢?

页面数量

由于我们这个项目是个SPA项目,路由是通过vue-auto-routing来自动生成的。为了更直观的看到里面有多少个页面,于是我把routes打印出来了。

如何提升项目的本地构建效率?

居然有258个之多!页面这么多,webpack打包构建的速度自然就会慢。

很好奇的一点这么多页面都是线上在跑的?

时间都用在哪?

为了对项目做一些有针对性的优化,我们需要了解整个编译过程中耗时分布,知道了各模块的耗时数据我们才能对症下药。

这里可以使用speed-measure-webpack-plugin插件来进行分析。

speed-measure-webpack-plugin不仅可以分析总的打包时间,还能分析各阶段loader 的耗时。

// 使用
const SpeedMeasurePlugin = require('speed-measure-webpack-plugin')
const plugins = [
  // ...
  new SpeedMeasurePlugin(),
]

如何提升项目的本地构建效率?

从上图来看,编译过程中的大部分时间都是用在vue文件的编译处理loader上。说白了还是文件太多了导致编译耗时比较长。

如何优化?

通用方案

开启缓存

webpack 中几种缓存方式:

  • cache-loader
  • hard-source-webpack-plugin
  • babel-loader 的 cacheDirectory 标志

我们这个项目使用的vue-cli版本是4.1.0,它已经内置了 cache-loader 和 **babel-loader 的 cacheDirectory 标志**两种缓存

我们可以二次启动看看

如何提升项目的本地构建效率?

二次启动花费了大概43秒,提升还是蛮大的,主要原因是 "冷启动" 时已经将 babel-loader、vue-loader 进行了缓存:

如何提升项目的本地构建效率?

另外一种缓存可自行测试 hard-source-webpack-plugin,主要缓存这种方案只在二次启动才能有明显的性能提升,与我首次冷启动就要**快**的预期不符。这种方案这里就不再试了

开启多线程

由于js单线程的特点,当有多个任务同时存在,它们也只能排队串行执行。

所以有没有可以使用类似web Worker的技术实现多线程编译处理,将部分任务分解到多个子进程中去并行处理,子进程处理完成后把结果发送到主进程中,从而减少总的构建时间。

可选方案:

  • thread-loader(官方推出)
  • parallel-webpack
  • HappyPack

从上面可以发现,编译过程,大部分时间都是在处理vue文件,所以可以针对vue-loader使用thread-loader

{
  test: /\.vue$/,
    include: path.resolve('src'),
      use: [
        {
          loader: 'thread-loader',
          options: {
            workers: 2,
          },
        },
      ],
},

注意:仅在耗时的操作中使用 thread-loader,否则使用 thread-loader 会后可能会导致项目构建时间变得更长,因为每个 worker 都是一个独立的 node 进程,创建worker的过程也是耗时的,尽量不要得不偿失。

此时的编译时间为41秒左右,提升好像并不是特别明显,可能在大型项目中才会发挥出更大的作用。

如何提升项目的本地构建效率?

当然还有很多方案可以一一尝试,但我觉得达到的效果应该都不会超过下面这个针对性方案。

针对性方案

该方案其实就是缩小我们的构建目标,整个项目虽然有很多页面,从上面路由来看多达258个,但我们平时在开发过程中其实只关注我们当前需要修改的页面,所以有没有可能在开发过程中,我只构建我需要用的页面,对于那些不需要的页面不参与构建,这样的话肯定能够大幅提升我们的本地构建时间。

这里还需要考虑的是,怎么对原有构建代码的侵入性做到最小?

思路

  • 新增构建脚本,原有npm run dev保持不变
  • 处理需要启动的页面,生成对应的路由routes.dev.js
  • 把原有routes提取成文件routes.pro.js
  • 再通过NormalModuleReplacementPlugin插件在编译过程进行文件替换
  • 最后再进行构建

构建脚本

新增start命令

// package.json
"start": "node ./build/cli.js start",

主要构建代码如下

// cli.js
const shell = require('shelljs')
const path = require('path')
const fs = require('fs')
const action = process.argv[2]
const arg = process.argv.slice(3)
let appName = arg[0]  // 指的是你要启动的项目(文件夹名)
// const startPath = arg.join('/')
console.log('🚀🚀------start------🚀🚀')
;(() => {
  if (!appName) {
    // 未输入项目名称则开启交互命令行
    openInquirer()
    return
  }
  // 启动
  if (action === 'start') {
    start()
  }
})()

function start() {
  // console.log('启动项目')
  process.env.action = 'signle'
  runTask(appName)
}
// 启动项目
async function runTask(appName) {
  const cmds = []
  console.log(`🚢【启动项目】${appName}`)
  generateRoute(appName) // 生成需要启动的路由

  const runProPath = path.resolve(__dirname, `../src/pages/${appName}`)

  // if (process.platform === 'win32') {
  //   cmds.push(`set runProPath=${runProPath}`)
  // } else {
  //   cmds.push(`export runProPath=${runProPath}`)
  // }
  // 检测项目是否存在
  const res = await getProject(runProPath)
  if (res.errno < 0) {
    // 抛出异常
    throw new Error('没有找到可启动的项目😭')
  } else {
    cmds.push(`npx vue-cli-service serve --open --colors --mode dev`)
  }

  const cmd = cmds.join(' && ')
  // return
  const { code } = shell.exec(cmd)
  return code
}

处理需要启动的页面

由于这个项目是用vue-auto-routing来自动生成路由的,所以这里我依然还是用它内部的一个库来自动生成

const { generateRoutes } = require('vue-route-generator')

// 处理需要启动的路由
function generateRoute() {
  console.log('--', path.resolve(__dirname, `../src/pages/${appName}/`))
  const code = generateRoutes({
    pages: path.resolve(__dirname, `../src/pages/${appName}/`),
    importPrefix: `@/pages/${appName}/`,
  })

  fs.writeFileSync(path.resolve(__dirname, `../src/routes.dev.js`), code)
}

替换需要启动的路由

根据用户输入的需要启动的文件夹名,我们为这个文件夹内的所有文件自动成了路由文件routes.dev.js,现在需要做的是通过webpack进行替换。

new webpack.NormalModuleReplacementPlugin(
    /src\/routes.pro.js/,
    './routes.dev.js',
  ),

使用

主要的工作完成,现在可以来启动试一试

比如:启动某**项目

# 启动命令 npm start + 项目名称(文件夹名)
npm start campusArea

如何提升项目的本地构建效率?

现在的启动时间大概在15秒左右,这与你当前文件夹下的文件数量有关,文件越少启动越快!二次启动时间大概在10秒左右,小项目首次启动时长大概都在10秒内

首次冷启动时长大概节省了1min,写代码的时间又变多了😂

优化

可能大家都习惯了npm run devnpm start,会忘记启动页面的参数?

不要急,这一点也考虑进去了,有个非常强大的库inquirer可以为我们开启交互式命令行。

// 未输入项目名称则开启交互命令行
function openInquirer() {
  // 获取所有可启动目录
  const projectList = fs.readdirSync(path.resolve(__dirname, '../src/pages'))
  // console.log('projectList', projectList)

  const promptList = [
    {
      type: 'list',
      message: '🚗请选择启动的目录:',
      name: 'pro',
      choices: [...projectList],
    },
  ]
  inquirer.prompt(promptList).then((answers) => {
    console.log(answers)
    appName = answers.pro
    start()
  })
}

当你直接npm start的时候,可以让你选择你想要启动的目录:

如何提升项目的本地构建效率?

结束。

原文首发地址点这里,欢迎大家关注公众号 「前端南玖」,如果你想进前端交流群一起学习,请点这里

我是南玖,我们下期见!!!文章来源地址https://www.toymoban.com/news/detail-463215.html

到了这里,关于如何提升项目的本地构建效率?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何利用chatgpt提升工作效率

    项目管理: 制定项目计划、跟踪进度、分配任务和记录里程碑。 客户服务: 回答常见问题、提供产品支持和处理客户投诉,提升客户满意度。 销售支持: 提供销售培训、销售脚本和客户资料,辅助销售团队进行销售活动。 财务管理: 制定预算、进行财务分析、管理账目和

    2024年01月23日
    浏览(46)
  • 如何提升软件质量及开发效率

    保证软件质量,是一个贯穿整个软件生存周期的重要问题,而不仅仅只是测试,软件测试只是能发现问题,就像温度计只能判断你是否感冒,从源头降低问题出现的概率才是重点。 软件开发中每个阶段都可能导致软件出现质量问题,并且越到后期,修改和维护的成本就越高,

    2024年02月12日
    浏览(53)
  • ChatGPT如何帮助DevOps提升效率

    DevOps 是一种方法论,旨在提高软件开发和 IT 运营团队的协作和效率。DevOps 涉及各种任务和流程的自动化,例如规划、编码、测试、部署、监控和故障排除。然而,其中一些任务和流程仍然有大量任务需要人工手动处理,而这会减慢软件产品和服务的交付和质量。随着人工智

    2024年02月03日
    浏览(38)
  • 探索现代前端工程化工具与流程:提升开发效率和项目质量

    前端工程化是指利用各种工具和技术来提高前端开发效率、代码质量和团队协作的一种开发模式。 它的背景和发展与前端技术的演进密切相关。 在过去,前端开发主要依靠手工编写 HTML、CSS和JavaScript 来构建网页。随着互联网的发展和前端技术的不断演进,前端的工作变得更

    2024年02月14日
    浏览(48)
  • 如何运用AR技术提升制造效率?这里有答案!

    当谈及AR技术在工业领域的应用,首先让人想到的是它为企业带来的巨大变革。从工业设计和制造到设备维护和维修,再到培训和技能传承以及设备操作和监测,AR技术凭借其独特的方式,帮助企业实现更高效的生产和运营。通过这些环节的优化,企业能够显著提升工作效率和

    2024年01月19日
    浏览(28)
  • 如何优化档案库房管理?一招学会轻松提升效率

    在现代企业运营中,档案库房扮演着重要的角色,承载着大量宝贵的纸质档案资料。这些档案包含着企业的历史、客户信息、法律文件等重要数据,对于企业的正常运转和决策制定至关重要。然而,传统的档案库房管理方式存在一系列的挑战和难题。 传统的档案库房管理通常

    2024年02月11日
    浏览(31)
  • 如何提升编写自动化测试case的效率?

    提升编写自动化测试case的效率需要考虑以下几个方面: 1. 待测应用程序的测试计划 首先,需要清晰地了解待测应用程序的测试计划,具体包括哪些功能需要测试、如何测试以及测试的优先级等。这有助于更好地规划测试用例的编写和执行。 如果你想学习自动化测试,我这边

    2024年02月11日
    浏览(35)
  • 探秘ChatGPT:如何利用AI提升论文写作效率

    ChatGPT无限次数: 点击直达 html 在当今信息爆炸的时代,论文写作是许多人工作者每天都要面对的任务。如何更高效地撰写出内容丰富、结构严谨的论文,一直是许多学者和研究人员所追求的目标。随着人工智能技术的不断发展,AI工具在论文写作领域的应用也越来越广泛。其

    2024年04月13日
    浏览(83)
  • 从0到1:如何使用AI工具提升工作效率?

    目录 1.chatPPT 2.GitHub Copilot  3.AUto.GPT 4.newBing 5.Microsoft  Designer 6.ChatDOC 7.Excel Formularizer 8.ChatMind. chatGPT国内镜像网站  链接地址 : ChatPPT_AI一键对话生成PPT_智能排版美化 (chat-ppt.com)  ChatPT是必优科技旗下面向PPT使用者提供的A生成PPT产品,产品基于ChatGPT与韦尼克模型,面向PPT用

    2024年02月05日
    浏览(40)
  • 问,由于java存在性能上,以及部分功能上的缺点,请问如何正确使用C,C++,Go,这三个语言,提升Java Web项目的性能?

    拓展阅读:版本任你发,我用java8 我明白Java虽然在许多方面表现出色,但在某些特定场景下可能会遇到性能瓶颈或功能限制。为了提升Java Web项目的性能,可以考虑将C、C++和Go这三种语言用于特定的组件或服务。以下是如何正确使用这些语言来提升性能的一些建议: 1. **性能

    2024年04月23日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包