修改组件库源码来获得符合需求的组件

项目需求多种多样,会出现开源组件库中的组件无法满足需求或者有 bug 的情况,可以区分以下情况,进行相应的处理。

以下示例以在 Vue2 中使用 Ant Design Vue 进行讲解。

样式修改

局部修改

这里我们以组件 Button 按钮为例,该组件文档上只枚举了固定的几种按钮类型,并确定了相关的颜色。自定义修改按钮的背景色及相关色彩是个常见的需求。

现进行自定义样式处理。

<template>
  <div>
    <a-button class="custom-btn">Default</a-button>
  </div>
</template>
<style lang="less" scoped>
.custom-btn {
  background: blue;
  color: white;
}
</style>

将代码运行,可以看到按钮色彩发生了改变。这里我们并没有使用深度选择器。

我们在浏览器中查看具体的组件dom解析

<div id="app">
  <div data-v-93538cd2="">
    <button data-v-93538cd2="" type="button" class="custom-btn ant-btn">
      <span>Default</span>
    </button>
  </div>
</div>

可以看到,我们在组件上添加的类选择器名称 custom-btn 直接渲染在原生 button 上。

那我们可以简单理解,当我们自定义的类,直接渲染在我们需要自定义样式的 dom 元素上,则不需要进行特殊的处理,直接可以自定义样式。

我们找一个稍微复杂一点的 Tabs 标签页 组件,进一步说明。

<template>
  <div>
    <a-tabs class="custom-tabs">
      <a-tab-pane key="1" tab="Tab 1">
        Content of Tab Pane 1
      </a-tab-pane>
      <a-tab-pane key="2" tab="Tab 2" force-render>
        Content of Tab Pane 2
      </a-tab-pane>
    </a-tabs>
  </div>
</template>

先进行无任何处理的样式修改:

<style lang="less" scoped>
.custom-tabs {
  .ant-tabs-tab {
    border: 1px solid blue;
  }
}

样式没变化。。。我们看下该段样式编译后的结束:

<style type="text/css">
.custom-tabs .ant-tabs-tab[data-v-93538cd2] {
  border: 1px solid blue;
}
</style>

看到 .ant-tabs-tab[data-v-93538cd2] 大概知道啥原因了。在我们自己的代码中,每一个dom节点,都会加上 scope 属性如 data-v-93538cd2,规避单页项目不同业务组件之间的样式相互影响。而现在使用的是组件库的组件,组件渲染后的dom上并没有 scope 属性。所以这里的样式是由于匹配不到,所以没生效。

这里的类选择器名称 ant-tabs-tab 是在浏览器查找需要自定义样式的 dom 节点上找到,那我们试试深度选择器 ::v-deep

<style lang="less" scoped>
.custom-tabs {
  ::v-deep .ant-tabs-tab {
    border: 1px solid blue;
  }
}

到这样式发生了变化。这里相对上面的例子,明显的变化是自定义类不在我们直接想自定义样式的 dom 节点上,我们需要自己在浏览器中查找想自定义样式的 dom 节点上已有的类,而这个 dom 类是在子组件中,不与父组件在同一dom层级。

在我们实际开发使用中,组件库组件未必挂载在当前组件内容中,比如挂载在页面body下。这里我们以 Modal 对话框组件为例。

<template>
  <div>
    <a-modal class="custom-modal" :visible="true" title="Basic Modal">
      <p>Some contents...</p>
      <p>Some contents...</p>
      <p>Some contents...</p>
    </a-modal>
  </div>
</template>
<style lang="less" scoped>
.custom-modal {
  .ant-modal-title {
    font-weight: bold;
    color: red!important;
  }
}
</style>

嗯,没生效。。。,那分析下,编译后的css代码在浏览中咋样。

<style type="text/css">
.custom-modal .ant-modal-title[data-v-93538cd2] {
  font-weight: bold;
  color: red!important;
}
</style>

看到 .ant-modal-title[data-v-93538cd2] 同样大概知道啥原因了。原因与上文一样,所以这里的样式是由于匹配不到,所以没生效。

那修改下样式,去除 scope 属性。

<style lang="less">
.custom-modal {
  .ant-modal-title {
    font-weight: bold;
    color: red!important;
  }
}
</style>

嗯,生效了。不过这里 modal 组件加上 custom-modal。那后续其他业务组件,也需要对 modal 组件进行样式自定义,名称极有可能也叫 custom-modal。

而由于上面我们并没有添加 scope 属性,这个样式是会造成全局影响。所以,更合理的做法,是对当前业务组件添加个容器类名。如这里是登录组件。那加个 login-wrap 类。

<style lang="less">
.login-wrap {
  .custom-modal {
    .ant-modal-title {
      font-weight: bold;
      color: red!important;
    }
  }
}
</style>

至此,对组件库组件的样式处理,目前这三类基本涉及到绝大部分场景。

下面对 vue 中使用深度选择器进一步讲解。

当项目中使用的 css 原生样式,则可以使用 >>> 深度选择器来修改第三方组件的样式。

当项目中使用的 css 预处理器,如 less 或 scss, 则可以使用 /deep/ 或者 ::v-deep 深度选择器来修改外用第三方组件的样式,其中深度选择器 ::v-deep 比较通用。

在vue3 中可以使用 :deep(<inner-selector>) 来深度选择到你要修改的样式,注意:这里没有空格。>>>/deep/::v-deep 在 vue3 中均以被弃用,虽然样式仍然生效,但是 Vue 已不推荐。

具体弃用的原因可以翻看这篇文章 scoped-styles-changes

全局修改

如果你要修改全局的样式,你可以在全局样式文件中写样式覆盖,引入到 main.js 中即可全局生效。

import "./src/styles/global.less";

内容修改

这里我们以 upload 组件为例。

拷贝源码进行修改

特定需求:在原有组件展示的信息基础上,还要显示上传文件的大小。

首先找到对应的 upload 组件:node_modules => ant-design-vue => es => upload。

对 upload 文件夹进行整体拷贝,将之粘贴到项目代码中,并对其进行修改。这样既可满足特定业务需求,又不会影响原组件在其他常规业务中的使用。

首先修改复制过来的 upload 组件对文件的路径引用,对依然还需要引用 node_modules 下的 ant-design-vue 组件库的代码文件,则批量修改路径为。

import xxx from 'ant-design-vue/es/xxx'

然后在 UploadList.js 中修改对应的代码

var preview = file.url ? [h(
  'a',
  ...
  [file.name]
), downloadOrDelete] : [h(
  'span',
  ...
  [file.name]
), downloadOrDelete];

修改后的代码

var preview = file.url ? [h(
  'a',
  ...
  [file.name, h('span', { style: { marginLeft: '20px' } }, [(file.size / 1024).toFixed(2) + 'kb'])]
), downloadOrDelete] : [h(
  'span',
  ...
  [file.name, h('span', { style: { marginLeft: '20px' } }, [(file.size / 1024).toFixed(2) + 'kb'])]
), downloadOrDelete];

效果对比:

局部使用

在需要使用的文件中引入、注册、使用

<template>
  <custom-upload
    name="file"
    action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
  >
    <a-button> <a-icon type="upload" /> Click to Upload </a-button>
  </custom-upload>
</template>
<script>
  import customUpload from '@/components/pc/upload'

  export default {
    components: { customUpload },
  };
</script>

全局使用

在main.js中进行全局引入。

import customUpload from '@/components/upload'
Vue.use(customUpload)

然而业务代码中并未找到 customUpload 组件。

我们翻看下 upload 组件 index.js 的实现。

import Upload from './Upload';
...
Upload.install = function (Vue) {
  ...
  Vue.component(Upload.name, Upload);
  ...
};

export default Upload;

可以看到,Vue.component 进行全局注册的组件名引用的是 Upload 文件的 name。

我们找到 Upload.js 文件,可以看到

...
export default {
  name: 'AUpload',
  ...
}

这里依然用的是以前的name,所以这里需要修改为我们自定义的组件名称 CustomUpload。

到这,刷新下界面,可以看到效果已经显现。

此种方式,需要注意组件库版本的锁死,否则当组件库进行版本升级后,复制过来的代码与 node_modules 中组件库的代码可能已不再匹配。

修改源码并打包替换

上面方式是对编译后的代码进行更改。那我们也可以对组件库源码进行修改,并进行编译,将编译后的文件进行替换。

  1. 我们进入 ant-design-vue git 地址[https://github.com/vueComponent/ant-design-vue]
  2. 由于现在的项目还是基于 vue2 项目,所以这里选择组件库的 tag 为 1.7.8,由于我们不需要考虑项目的其他分支或者tag代码,所以可以直接对当前code进行zip下载。
  3. 下载解压后,对当前目录执行 npm i 命令,包下载完成后,找到 package.json 文件,看到可以执行 npm run start 命令,进行项目启动。

到这里项目已经成功启动了,那我们也可以展开对 upload 组件代码的更改。但目前我们还无从下手,不知道从哪里进行更改。

那我们回到最开始项目执行的命令,npm run start,那实际执行的语句是 cross-env NODE_ENV=development webpack-dev-server --config webpack.config.js

从上一步我们知道项目启动的配置文件是 webpack.config.js,我们找到这个文件,可以看到一段代码

  ...
  entry: {
    app: './examples/index.js',
  },
  ...

我们知道了应用的入口文件是 /examples/index.js,那我们找到这个文件,可以看到

import 'babel-polyfill';
import Vue from 'vue';
import App from './App.vue';
import Antd from 'ant-design-vue';
import 'ant-design-vue/style.js';

Vue.use(Antd);

new Vue({
  el: '#app',
  render: h => h(App),
});

到这,已经看到页面渲染的代码在 App.vue 文件中。我们点开这个文件,可以看到里面的代码与当前项目展示一致。那我们对 App.vue 文件进行代码处理,页面内容也跟着进行变化。

此时回到最初的问题,我们是希望修改 upload 组件的源码,但该如何进行引入以及修改呢。

我们再回到上面一段代码,可以看到我们引入了 ant-design-vue 组件库,以及 ant-design-vue/style.js 样式代码。可是翻看下 package.json 的依赖,我们并没有看到 ant-design-vue,再说,我们现在修改的就是这个框架,框架都没进行发布,怎么可能会有这个依赖包呢。这岂不是鸡生蛋蛋生鸡的问题。所以,这里引入的不是 node_modules 里面的依赖。

那我们再翻看下 webpack.config.js 文件,是否是编译工具进行了处理。

  ...
  alias: {
    'ant-design-vue': path.join(__dirname, './components'),
    vue$: 'vue/dist/vue.esm.js',
  },
  ...

到这里就明白了,原来 ant-design-vue 是别名,对应的路径是现有项目 components 里面的组件代码。

找到 ./components/index.js 文件,结合 ./examples/index.js 可以看到是组件进行了全局注入。

./components/index.js

components = [...]
const install = function(Vue) {
  components.map(component => {
    Vue.use(component);
  });
};

./examples/index.js

...
import Vue from 'vue';
import Antd from 'ant-design-vue';
import 'ant-design-vue/style.js';

Vue.use(Antd);
...

那到这里,我们明白,在 ./examples/App.vue 文件中直接使用 upload 组件,并对 ./components/upload下的组件代码进行修改,即可看到变化。

我们在 ./examples/App.vue 中添加代码

<template>
  <a-upload
    name="file"
    action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
  >
    <a-button> <a-icon type="upload" /> Click to Upload </a-button>
  </a-upload>
</template>

接着,我们找到 ./components/upload/UploadList.jsx 文件,对其进行修改。

const preview = file.url
  ? [
      <a
        ...
      >
        {file.name}
        <span style="margin-left: 20px;">{ (file.size / 1024).toFixed(2) + 'kb' }</span>
      </a>,
      ...
    ]
  : [
      <span
        ...
      >
        {file.name}
        <span style="margin-left: 20px;">{ (file.size / 1024).toFixed(2) + 'kb' }</span>
      </span>,
     ...
    ];

可以看到,相比对编译后的代码进行修改,对组件库源码进行修改会明显简单一些。

到这可以执行打包命令 npm run dist。可以看到项目中生成了三个编译后的文件目录,分别为es,lib,dist。

我们将这三个文件进行复制,替换我们日常开发项目下的 node_modules 中的 ant-design-vue中的同名目录。

然后对项目进行重启,即可看到效果。到这里如果想将当前改动发布到私有库中,可以参考这篇文章 公共资源包发布流程详解。

但这种弊端明显:

  1. 这种改动会造成所有引用该组件库的项目均受影响,如果是bug修复,那是良性的影响,但是在日常开发中,遇到更多的是组件本身不满足特定业务的需求,进而需要修改原有组件的功能,这种改变,对A项目是适当的更改,但是对B项目可能就是不恰当的变动。
  2. clone开源组件库进行定制开发后,将无法随开源库的迭代逐步消除本身的bug。

这种方式除非严重的bug修正,如果是定制改动,明显不如上一种方式。而bug修正,更合理的方式是在原仓库下提 PR,让作者进行合并。

patch-package 打补丁

当在项目中修改了 ant-design-vue 的源码,并且需要将改动同步到团队成员,那也可以使用 patch-package 对组件库打补丁,将修改同步到项目代码上。

我们先进行安装 npm i patch-package -S

然后进行源码的修改:找到 node_modules 目录中 ant-design-vue 下 upload 组件源码

在 UploadList.js 中进行修改

var preview = file.url ? [h(
  'a',
  ...
  [file.name]
), downloadOrDelete] : [h(
  'span',
  ...
  [file.name]
), downloadOrDelete];

修改后的代码

var preview = file.url ? [h(
  'a',
  ...
  [file.name, h('span', { style: { marginLeft: '20px' } }, [(file.size / 1024).toFixed(2) + 'kb'])]
), downloadOrDelete] : [h(
  'span',
  ...
  [file.name, h('span', { style: { marginLeft: '20px' } }, [(file.size / 1024).toFixed(2) + 'kb'])]
), downloadOrDelete];

执行命令创建组件库补丁文件:npx patch-package ant-design-vue,这里 ant-design-vue 指的是被修改的依赖包的名字,不是被修改的文件的名字。

执行该命令后会在项目根目录中自动创建一个 patches 文件夹,该文件夹中会出现一个 修改依赖包名称+version.patch 的补丁文件。本次操作这里出现的文件名称为 ant-design-vue+1.7.8.patch。

那 .patch 文件为什么能作为补丁文件,我们打开 ant-design-vue+1.7.8.patch 文件看一下里面内容。

diff --git a/node_modules/ant-design-vue/es/upload/UploadList.js b/node_modules/ant-design-vue/es/upload/UploadList.js
index e0dfa8a..573ac90 100644
--- a/node_modules/ant-design-vue/es/upload/UploadList.js
+++ b/node_modules/ant-design-vue/es/upload/UploadList.js
@@ -234,7 +234,7 @@ export default {
             }
           }
         }]),
-        [file.name]
+        [file.name, h('span', { style: { marginLeft: '20px' } }, [(file.size / 1024).toFixed(2) + 'kb'])]
       ), downloadOrDelete] : [h(
         'span',
         {
@@ -249,7 +249,7 @@ export default {
             title: file.name
           }
         },
-        [file.name]
+        [file.name, h('span', { style: { marginLeft: '20px' } }, [(file.size / 1024).toFixed(2) + 'kb'])]
       ), downloadOrDelete];
       var style = file.url || file.thumbUrl ? undefined : {
         pointerEvents: 'none',

其实就是一些 git diff 记录描述,补丁原理呼之欲出 —— patch-package 会将当前 node_modules 下的源码与原始源码进行git diff,并在项目根目录下生成一个patch补丁文件。

那测试是否生效,首先删除 node_modules 文件夹。然后修改根目录下的 package.json 文件,在 scripts 中添加 “postinstall”: “patch-package”。

"scripts": {
  "postinstall":"patch-package"
},

执行 npm i,重新安装依赖。

D:\project\personal\frontEndTestProject\modern_dev\my_project>npm i
...
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
...
> my_project@0.1.0 postinstall
> patch-package

patch-package 8.0.0
Applying patches...
ant-design-vue@1.7.8 ✔

added 1468 packages in 2m

可以看到源码中被修改的代码还在。这里是因为 postinstall 是 Node.js 应用程序中的 NPM Scripts 钩子,它表示在 npm i 执行完毕后自动执行的脚本命令。

至此补丁文件已经生成完毕,我们需要将它提交到 git 中,直接执行常规 git 操作即可。

当其他同事拉下代码后如何应用补丁呢?已经下载过依赖包的项目,直接执行 npx patch-package,即可将补丁打上。如果是新拉下来的项目,直接执行 npm i,则在下载依赖包结束后,自动执行打上补丁的过程。

如果你安装的包版本和你之前生成的补丁中记录时的包版本不一样,npx patch-package 会报错,通过提示你可以更方便的定位问题

my_project>npx patch-package

patch-package 8.0.0
Applying patches...
ant-design-vue@1.7.8 ✔

Warning: patch-package detected a patch file version mismatch

  Don't worry! This is probably fine. The patch was still applied
  successfully. Here's the deets:

  Patch file created for

    ant-design-vue@1.7.8

  applied to

    ant-design-vue@1.7.0

  At path

    node_modules/ant-design-vue

  This warning is just to give you a heads-up. There is a small chance of
  breakage even though the patch was applied successfully. Make sure the package
  still behaves like you expect (you wrote tests, right?) and then run

    patch-package ant-design-vue

  to update the version in the patch file name and make this warning go away.

---
patch-package finished with 1 warning(s).

如果组件库有问题需要及时处理,并需要同步到其他团队成员,这是一种低成本又规范化的方式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python脚本必加代码:99%的程序员都忽视了这个细节!

文章目录 一、初识 if __name__ __main__二、__name__ 和 __main__ 是什么&#xff1f;三、实战讲解四、实际应用场景测试代码提高代码可重用性避免不必要的执行 五、深入理解和更多用法使用 argparse 解析命令行参数使用 unittest 进行单元测试使用 multiprocessing 创建子进…

03:PostgreSQL逻辑结构(表空间、数据库、模式、表、索引)

环境规划&#xff1a; 操作系统&#xff1a;CentOS 7.9 64bitPostgreSQL 版本&#xff1a;16.x 或 15.x安装用户&#xff1a;postgres软件安装目标路径&#xff1a;/usr/pgsql-<version>数据库数据目录&#xff1a;/pgdata 目录 表空间Tablespace 默认表空间 手动创建…

Jenkins--从入门到入土

Jenkins–从入门到入土 文章目录 Jenkins--从入门到入土〇、概念提要--什么是CI/DI&#xff1f;1、CI&#xff08;Continuous Integration&#xff0c;持续集成&#xff09;2、DI&#xff08;DevOps Integration&#xff0c;DevOps 集成&#xff09;3、解决的问题 一、Jenkins安…

【代码随想录】【算法训练营】【第20天】 [654]最大二叉树 [617]合并二叉树 [700]二叉搜索树中的搜索 [98]验证二叉搜索树

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 19&#xff0c;一个愉快的周日~ day 20&#xff0c;一个悲伤的周一~ 题目详情 [654] 最大二叉树 题目描述 654 最大二叉树 解题思路 前提&#xff1a;构造二叉树 思路&#xff1a;寻找根节…

基于Django框架的项目搭建后台首页

(1). 创建数据库 osdb 进入MySQL数据库中&#xff0c;创建一个数据库名为&#xff1a;osdb 通过数据表结构来创建数据表&#xff1a; -- 员工信息表 CREATE TABLE user (id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 员工账号id,username varchar(50) DEFAULT NULL C…

路径规划 | 图解粒子群(PSO)算法(附ROS C++仿真)

目录 0 专栏介绍1 从鸟群迁徙说起2 粒子群算法基本概念3 粒子群算法流程4 粒子群算法ROS实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法、智能算法等)&#xff1b;局部规…

跨境热销爆款货源哪里找?选品工具不能少

通常&#xff0c;跨境电商找热销货源的几种方法&#xff1a; 1、使用Google Trends、亚马逊销售排行等来追踪和分析当前的市场趋势和热门产品&#xff1b; 2、关注社交媒体、行业论坛和博客等渠道&#xff0c;以获取最新的市场信息和消费者反馈&#xff1b; 3、在主流的跨境…

Oracle实践|内置函数之数学型函数

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注…

CDC 数据实时同步入湖的技术、架构和方案(截至2024年5月的现状调研)

近期&#xff0c;对 “实时摄取 CDC 数据同步到数据湖” 这一技术主题作了一系列深入的研究和验证&#xff0c;目前这部分工作已经告一段落&#xff0c;本文把截止目前&#xff08;2024年5月&#xff09;的研究结果和重要结论做一下梳理和汇总。为了能给出针对性的技术方案&…

基于小波分析和机器学习(SVM,KNN,NB,MLP)的癫痫脑电图检测(MATLAB环境)

癫痫是一种由大脑神经元突发性异常放电导致的大脑功能性障碍疾病。据世界卫生组织统计&#xff0c;全球约有7000万人患有癫痫。癫痫患者在发病时呈现肌肉抽搐、呼吸困难、意识丧失等症状。由于癫痫发作的偶然性&#xff0c;患者极有可能在高空、驾驶、游泳等危险情况下发病并丧…

掌握栈回溯意味着什么?

来源&#xff1a;公众号【鱼鹰谈单片机】 作者&#xff1a;鱼鹰Osprey ID &#xff1a;emOsprey 历时两个月&#xff08;1/3&#xff09;&#xff0c;第一个完成电子表项目的学员出现了&#xff0c;并且顺利的掌握了栈回溯技巧&#xff0c;在工作中快速定位了一个任务异常挂起…

【STM32】 独立看门狗配置方法

什么是看门狗 看门狗&#xff08;watchdog&#xff09;指的是一种监控系统或程序&#xff0c;用于定期检测和监控其他系统或程序的运行状态&#xff0c;并在出现问题或故障时采取相应的措施。它可以是硬件设备&#xff0c;也可以是软件程序。 在计算机领域中&#xff0c;看门狗…

全国青少年信息素养大赛历届复赛、国赛真题

由于2024年信息素养大赛初赛比较简单&#xff0c;特别是Scrath图形化编程和Python编程&#xff0c;八九分钟及半个小时内交卷的也多&#xff0c;100分及80分以上的比较多&#xff0c;&#xff08;各赛区复赛晋级根据两个指标进行排名&#xff0c;初赛成绩和答题用时。首先根据分…

AC/DC电源模块:提供高质量的电力转换解决方案

BOSHIDA AC/DC电源模块&#xff1a;提供高质量的电力转换解决方案 AC/DC电源模块是一种电力转换器件&#xff0c;可以将交流电转换为直流电。它通常用于各种电子设备和系统中&#xff0c;提供高质量的电力转换解决方案。 AC/DC电源模块具有许多优点。首先&#xff0c;它能够提…

玩机进阶教程------固件中的分区表 gpt_backup0.bin gpt_both0.bin gpt_main0.bin有什么区别 怎么修改分区表【一】

不管是emmc还是ufs在官方的线刷包中都有分区表存在。分区表包含有各个分区的地址段落。如果你在fast模式刷入官方固件还解决不了系统问题。那有几率是分区表损坏。这种情况无论你怎么刷写分区是解决不了问题的。 此类话题在百度很难搜索到,大多都是讲分区表的类型 结构 等等,…

23种设计模式全面总结 | 快速复习(附PDF+MD版本)

本篇文章是对于23种设计模式的一个全面的总结&#xff0c;受限于文章篇幅无法对每个设计模式做到全面的解析&#xff0c;但几乎每个设计模式都提供了案例和类图结构&#xff0c;非常适合快速复习和在学习设计模式之前的全预习把握。 &#x1f4a1;文章的 pdf markdown 版本可通…

驱动开发执行应用层时报ELF: not found,syntax error: unexpected “(“错误

问题&#xff1a; 原因&#xff1a;在跨平台的时候注意我们使用的编译器&#xff0c;我是因为没有没有交叉编译导致的。 出问题之前使用的是gcc test_01_normal.c -o test_01_normal生成的文件&#xff0c;导致&#xff0c;执行时报ELF这种问题。 解决办法&#xff1a;arm-li…

将本地项目上传到 gitee 仓库

1、创建 gitee 仓库 到 gitee 官网&#xff0c;新建仓库 配置新建仓库 完成仓库的创建 项目上传到仓库 上传项目需要安装git git官方下载地址&#xff1a;git下载地址 安装完成&#xff0c;前往本地项目所在文件夹&#xff0c;右击选择 Git Bash Here 刚下载完成需要配置G…

粤嵌—2024/5/13—删除排序链表中的重复元素(✔)

代码实现&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* deleteDuplicates(struct ListNode *head) {if (head NULL || head->next NULL) {return head;}struct ListNode *…

【计算机毕业设计】基于SSM+Vue的新能源汽车在线租赁管理系统【源码+lw+部署文档】

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;新能源汽车在线租赁当然也不能排除在外。新能源汽车在线租赁是以实际运用为开发背景&#xff0c;运用软件工程开发方法&…