清朝云资源网

作者: 清朝云

  • linux 如何不记录本次会话的命令


    共计 189 个字符,预计需要花费 1 分钟才能阅读完成。

    1. 临时关闭历史记录功能

    set +o history

    该命令会临时关闭历史记录功能,这意味着在这命令之后你执行的所有操作都不会记录到历史中,然而这个命令之前的所有东西都会原样记录在历史列表中。

    2. 清理之前的记录

    vim ~/.bash_history

    就算是一登录就执行关闭历史记录,历史记录中还会有 set +o history 命令,此时可以直接编辑 ~/.bash_history 文件删除即可。

    提醒:本文发布于217天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • WordPress每天60秒看世界自动写文章

    前言

    因接口失效,所以该方式已经失效,有能力的把知乎接口换成其他的就可以了。

    源码介绍

    • 有些博客站每天会自动采集并生成一篇《每天60秒读懂世界》的文章,代码在下方
    • 注意:此代码会在根目录下创建名称为60s的目录用于存放图片。
    • 自动创建文章分类:每天60秒读懂世界
    • 如果创建分类后在前台页面点击分类不显示分类下的文章,需要在后台重新编辑保存下分类(不需要修改内容)

    使用教程

    • 复制代码到60s.php然后放到网站根目录
    • 然后打开修改33行的链接为个人网站链接即可
    • 访问https://你的域名/60s.php即可
    • 宝塔面板-计划任务-访问URL-每日定时自动执行即可

    开源代码

    <?php
    $date = file_get_contents("https://www.zhihu.com/api/v4/columns/c_1261258401923026944/items");
    $date = json_decode($date);
    $content = $date->data[0]->content;
    $content = preg_replace('/(<a.*?>[sS]*?</a>)/','',$content);
    $pattern ='<img.*?src="https://www.xrbk.cn/(.*?)">';
    preg_match($pattern,$content,$matches);
    $src_path = $matches[1];
    $src = imagecreatefromstring(file_get_contents($src_path));
    $info = getimagesize($src_path);
    //裁剪开区域左上角的点的坐标
    $x = 0;
    $y = 0;
    //裁剪区域的宽和高
    $width = 720;
    $height = 350;
    //最终保存成图片的宽和高,和源要等比例,否则会变形
    $final_width = 720;
    $final_height = round($final_width * $height / $width);
    //将裁剪区域复制到新图片上,并根据源和目标的宽高进行缩放或者拉升
    $new_image = imagecreatetruecolor($final_width, $final_height);
    imagecopyresampled($new_image, $src, 0, 0, $x, $y, $final_width, $final_height, $width, $height);
    $ext = pathinfo($src_path, PATHINFO_EXTENSION);
    $rand_name = date("Ymd") . "." . $ext;
    //创建文件夹保存图片
    if (!file_exists("60s")){
        mkdir ("60s",0777,true);
    }
    imagejpeg($new_image,"60s/".$rand_name);
    imagedestroy($src);
    imagedestroy($new_image);
    $content = strip_tags($content,'<p>');
    $content = '<img class="size-full wp-image-156 aligncenter" src="https://www.70xr.com/60s/'.$rand_name.'" alt="" width="720" height="350" />'.$content;
    require __DIR__ . '/wp-config.php';
    global $wpdb;
    date_default_timezone_set('PRC');
    $post_tag_arr = array();
    //先检查文章分类是否存在
    $term_taxonomy_id = $wpdb->get_row("SELECT tt.term_taxonomy_id from $wpdb->terms t join $wpdb->term_taxonomy tt on t.term_id = tt.term_id where t.name = '每天60秒读懂世界' and tt.taxonomy = 'category' ")->term_taxonomy_id;
    if (!$term_taxonomy_id) {
        $wpdb->query("insert into $wpdb->terms (name,slug,term_group)VALUES('每天60秒读懂世界','60miao','0')");
        $category_id = $wpdb->insert_id;
        $wpdb->query("insert into $wpdb->term_taxonomy (term_id,taxonomy,description,parent,count)VALUES($category_id,'category','','0','1')");
        $term_taxonomy_id = $wpdb->insert_id;
    }
    $post_tag_arr[] = $term_taxonomy_id;
    
    $html = $content;
    
    //标题
    $title = $date->data[0]->title;
    //标题存在则不插入
    $posts = $wpdb->get_row("SELECT id from $wpdb->posts where post_title = '$title' ");
    if (!$posts) {
        $now = current_time('mysql');
        $now_gmt = current_time('mysql', 1);
        $wpdb->insert(
            $wpdb->posts,
            array(
                'post_author' => 1,
                'post_date' => $now,
                'post_date_gmt' => $now_gmt,
                'post_content' => $html,
                'post_title' => $title,
                'post_excerpt' => '',
                'post_status' => 'publish',
                'comment_status' => 'open',
                'ping_status' => 'open',
                'post_password' => '',
                'post_name' => $title,
                'to_ping' => '',
                'pinged' => '',
                'post_modified' => $now,
                'post_modified_gmt' => $now_gmt,
                'post_content_filtered' => '',
                'post_parent' => '0',
                'guid' => '',//文章链接 插入后修改
                'menu_order' => '0',
                'post_type' => 'post',
                'post_mime_type' => '',
                'comment_count' => '0',
    
            )
        );
        $insertid = $wpdb->insert_id;
        $post_guid = get_option('home') . '/?p=' . $insertid;
        $wpdb->query(" UPDATE $wpdb->posts SET guid=$post_guid where id = $insertid ");
    
        //插入文章和分类、标签、专题的关系
        $sql = " INSERT INTO $wpdb->term_relationships (object_id,term_taxonomy_id,term_order) VALUES ";
        foreach ($post_tag_arr as $key => $value) {
            $sql .= "($insertid, $value, '0'),";
        }
        $wpdb->query(rtrim($sql, ","));
    
    }

     

  • CorePress- 美观功能强大的WordPress主题

    界面截图

    主题介绍

    • CorePress主题,强大的WordPress定制主题,体积小,性能强,功能多,不可多得的一款高性能,高颜值主题。
    • 首先需要讲的是,CorePress是CorePress Pro的免费版本,该免费版本是果核开发的,Pro版本是本站使用的主题,简洁好看,功能也不少。
    • 目前Pro主题没有发现任何问题,使用体验还是非常不错的,价格也不算贵,有能力的支持一下。

    作者站点

    https://www.lovestu.com/

    项目地址

    https://www.lovestu.com/corepress-free

    Pro购买地址

    https://www.lovestu.com/corepress.html
  • 09月27日,星期五, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 这张洲际导弹发射图藏了多少细节? 9月26日,我军向太平洋发射洲际弹道导弹的现场图公布,引发广泛讨论。这张洲际弹道导弹发射图藏了多少细节?

    2. 暴跌19℃!降温排行榜看冷空气有多猛 据悉,强冷空气于9月26日开始将影响我国,9月29日到10月1日将重点影响中东部大部地区,局地暴跌19℃。

    3. 全国各地花团锦簇喜迎国庆 国庆假期将至,中国各地都准备了哪些活动迎接这个长假?新兴旅游线路、创新业态组合,全国各地花团锦簇喜迎国庆。

    4. #普京动用核武器的话中国该怎么办#

    5. 微信实况图的第一批受害者出现了 近日,自微信朋友圈支持发布实况照片后,第一批受害者已经出现。有网友表示:每张好看的照片都有我的公鸭嗓声。

    6. 三只羊“原切牛肉卷”实为调制肉 9月26日晚,合肥通报三只羊问题调查情况,该份通报回应了此前三只羊公司带货的“原切牛肉卷”遭打假风波,称实为调制肉。

    7. 东北雨姐哭了:有问题倾家荡产都赔 9月26日,网红“东北雨姐”回应近期引起争议的“殴打博主”及“红薯粉条”事件。东北雨姐:不该爆粗口,有问题倾家荡产都赔。

    8. 五角大楼回应中国发射洲际导弹 25日,五角大楼表示,美国对中国发射洲际弹道导弹进行了跟踪,认为有必要就核武库扩充和军备集结问题与中国进行实质性的接触。

    9. 外资买爆中国资产

    10. 大爷地铁上偷拍女子被暴打 9月25日,杭州地铁上大爷疑似偷拍女子,女子与其产生激烈冲突,后续已报警。工作人员表示:碰到偷拍可以联系工作人员或警卫室。

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 诚心发问为什么大家都在说《死神》的时髦值很高?
    链接: https://daily.zhihu.com/story/9775722
    ———————-
    标题: 黑神话悟空:史上最公平的 3A 大作,只要你有 GPU
    链接: https://daily.zhihu.com/story/9775709
    ———————-
    标题: 清华计算机入学教育之「关于如何做科研的一些个人经验」
    链接: https://daily.zhihu.com/story/9775712
    ———————-
    标题: 去年我国结婚人数为近十年来首次回升,25 至 29 岁结婚人数最多,这一数据背后反映出哪些问题?
    链接: https://daily.zhihu.com/story/9775718
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9775731
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: 英特尔确认第 13、14 代酷睿桌面处理器不稳定根本原因,将推新版修复微代码
    发布时间: 2024-09-26T10:21:07.787
    新闻简介: 不稳定是因为 IA core 的时钟树电路在高电压、温度下可靠性降低,可能导致时钟工作周期偏移。
    ———————-
    标题: 摩根士丹利:iPhone 16 系列成近年最不受欢迎一代,交货周期为 5 年来最短
    发布时间: 2024-09-26T11:54:54.503
    新闻简介: #iPhone16成近年最不受欢迎一代#美国投资银行摩根士丹利(Morgan Stanley)昨日向投资者分享了一份简报,认为从苹果官网的交货周期判断,iPhone 16 系列的销量有所下滑。
    ———————-
    标题: 华为举行鸿蒙誓师大会:腾讯、百度、京东、支付宝等参会,余承东高呼“全力冲刺”
    发布时间: 2024-09-26T16:50:24.443
    新闻简介: 据华为官方今日消息,为加速推进移动应用加入鸿蒙生态,以“待到山花烂漫时”为主题的鸿蒙千帆会战誓师大会昨日在华为坂田基地举行,这标志着鸿蒙生态正加速迈向全面商用的新征程。
    ———————-
    标题: 上线 5 天,中国移动 5G 消息日活苹果终端超 8 万
    发布时间: 2024-09-26T08:36:29.63
    新闻简介: 苹果于 9 月 18 日发布了支持 RCS 信息的 iOS 18.1 开发者预览版 Beta 4 更新,截至 9 月 22 日,中国移动网内 5G 消息日活终端量已经超过 8 万。
    ———————-
    标题: 小米 Redmi Note 14 Pro+ 手机发布: 首发第三代骁龙 7s、6200mAh 硅碳电池, 首发 1899 元起
    发布时间: 2024-09-26T19:20:17.11
    新闻简介: 小米 Redmi Note 14 Pro+ 手机今日正式发布,该机首发第三代骁龙 7s、6200mAh 硅碳电池,1999 元起,首销 1899 元起。
    ———————-
    标题: 小米 Redmi Note 14 Pro 手机发布:天玑 7300-Ultra,首发价 1399 元起
    发布时间: 2024-09-26T19:26:04.95
    新闻简介: Redmi Note 14 Pro 可选暮光紫、幻影青、镜瓷白、子夜黑四款配色,第一次采用曲面屏设计,同时背部采用了拼色设计(幻影青、暮光紫)。
    ———————-
    标题: 骁龙 8 Elite 旗舰芯片曝光,小米 15 系列手机将首发
    发布时间: 2024-09-26T16:39:22.507
    新闻简介: 科技媒体 smartprix 今天(9 月 26 日)发布博文,曝料称高通骁龙 8 Gen 4 芯片上市后,名称将叫做“骁龙 8 Elite”,搭载该芯片的小米 15 系列将于 10 月 23 日发布。
    ———————-
    标题: 力度新升级:全国可领政府 2000 元数码家电补贴,四川加码至高再省 4000 元
    发布时间: 2024-09-26T16:12:55.457
    新闻简介: 政府补贴无需回收旧物
    ———————-
    标题: 董宇辉回应直播带货“货不对板”:无法保证商家不夸大,出现问题第一时间售后
    发布时间: 2024-09-26T10:17:30.993
    新闻简介: 董宇辉表示,公司的做法是选品上播后会主动进行测,让员工用自己的地址正常下单,并进行部分送检,每个月都在这方面会花费不少的时间及费用。
    ———————-
    标题: 三只羊回应被罚 6894.91 万元:愿承担相关法律责任,将全面开展内部整顿
    发布时间: 2024-09-26T21:29:00.413
    新闻简介: 合肥三只羊网络科技有限公司今天晚间发布声明,就被罚 6894.91 万元进行回应,并就近期公司在直播中虚假宣传误导消费者的问题致歉。
    ———————-
    标题: 消息称阿里京东即将互相开放:淘宝接入京东物流,京东接入支付宝
    发布时间: 2024-09-26T17:19:30.11
    新闻简介: 而与此同时,京东也将正式接入支付宝支付,预计在双 11 前夕推出。目前消费者在京东下单,默认的支付方式排序依次为京东支付、云闪付、微信支付等。
    ———————-
    标题: “索尼 PS 之父”久多良木健:《黑神话:悟空》首月销量突破 2000 万份
    发布时间: 2024-09-26T13:03:33.963
    新闻简介: 也就是说,在不到一个月的时间内,《黑神话:悟空》又卖出了 1000 万份,在全球单机游戏史上也是一个不俗的成绩。#黑神话悟空销量突破2000万#
    ———————-

    —- IT之家新闻 End —-

  • 09月27日,星期五, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 这张洲际导弹发射图藏了多少细节? 9月26日,我军向太平洋发射洲际弹道导弹的现场图公布,引发广泛讨论。这张洲际弹道导弹发射图藏了多少细节?

    2. 暴跌19℃!降温排行榜看冷空气有多猛 据悉,强冷空气于9月26日开始将影响我国,9月29日到10月1日将重点影响中东部大部地区,局地暴跌19℃。

    3. 全国各地花团锦簇喜迎国庆 国庆假期将至,中国各地都准备了哪些活动迎接这个长假?新兴旅游线路、创新业态组合,全国各地花团锦簇喜迎国庆。

    4. #普京动用核武器的话中国该怎么办#

    5. 微信实况图的第一批受害者出现了 近日,自微信朋友圈支持发布实况照片后,第一批受害者已经出现。有网友表示:每张好看的照片都有我的公鸭嗓声。

    6. 三只羊“原切牛肉卷”实为调制肉 9月26日晚,合肥通报三只羊问题调查情况,该份通报回应了此前三只羊公司带货的“原切牛肉卷”遭打假风波,称实为调制肉。

    7. 东北雨姐哭了:有问题倾家荡产都赔 9月26日,网红“东北雨姐”回应近期引起争议的“殴打博主”及“红薯粉条”事件。东北雨姐:不该爆粗口,有问题倾家荡产都赔。

    8. 五角大楼回应中国发射洲际导弹 25日,五角大楼表示,美国对中国发射洲际弹道导弹进行了跟踪,认为有必要就核武库扩充和军备集结问题与中国进行实质性的接触。

    9. 外资买爆中国资产

    10. 大爷地铁上偷拍女子被暴打 9月25日,杭州地铁上大爷疑似偷拍女子,女子与其产生激烈冲突,后续已报警。工作人员表示:碰到偷拍可以联系工作人员或警卫室。

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 诚心发问为什么大家都在说《死神》的时髦值很高?
    链接: https://daily.zhihu.com/story/9775722
    ———————-
    标题: 黑神话悟空:史上最公平的 3A 大作,只要你有 GPU
    链接: https://daily.zhihu.com/story/9775709
    ———————-
    标题: 清华计算机入学教育之「关于如何做科研的一些个人经验」
    链接: https://daily.zhihu.com/story/9775712
    ———————-
    标题: 去年我国结婚人数为近十年来首次回升,25 至 29 岁结婚人数最多,这一数据背后反映出哪些问题?
    链接: https://daily.zhihu.com/story/9775718
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9775731
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: 英特尔确认第 13、14 代酷睿桌面处理器不稳定根本原因,将推新版修复微代码
    发布时间: 2024-09-26T10:21:07.787
    新闻简介: 不稳定是因为 IA core 的时钟树电路在高电压、温度下可靠性降低,可能导致时钟工作周期偏移。
    ———————-
    标题: 摩根士丹利:iPhone 16 系列成近年最不受欢迎一代,交货周期为 5 年来最短
    发布时间: 2024-09-26T11:54:54.503
    新闻简介: #iPhone16成近年最不受欢迎一代#美国投资银行摩根士丹利(Morgan Stanley)昨日向投资者分享了一份简报,认为从苹果官网的交货周期判断,iPhone 16 系列的销量有所下滑。
    ———————-
    标题: 华为举行鸿蒙誓师大会:腾讯、百度、京东、支付宝等参会,余承东高呼“全力冲刺”
    发布时间: 2024-09-26T16:50:24.443
    新闻简介: 据华为官方今日消息,为加速推进移动应用加入鸿蒙生态,以“待到山花烂漫时”为主题的鸿蒙千帆会战誓师大会昨日在华为坂田基地举行,这标志着鸿蒙生态正加速迈向全面商用的新征程。
    ———————-
    标题: 上线 5 天,中国移动 5G 消息日活苹果终端超 8 万
    发布时间: 2024-09-26T08:36:29.63
    新闻简介: 苹果于 9 月 18 日发布了支持 RCS 信息的 iOS 18.1 开发者预览版 Beta 4 更新,截至 9 月 22 日,中国移动网内 5G 消息日活终端量已经超过 8 万。
    ———————-
    标题: 小米 Redmi Note 14 Pro+ 手机发布: 首发第三代骁龙 7s、6200mAh 硅碳电池, 首发 1899 元起
    发布时间: 2024-09-26T19:20:17.11
    新闻简介: 小米 Redmi Note 14 Pro+ 手机今日正式发布,该机首发第三代骁龙 7s、6200mAh 硅碳电池,1999 元起,首销 1899 元起。
    ———————-
    标题: 小米 Redmi Note 14 Pro 手机发布:天玑 7300-Ultra,首发价 1399 元起
    发布时间: 2024-09-26T19:26:04.95
    新闻简介: Redmi Note 14 Pro 可选暮光紫、幻影青、镜瓷白、子夜黑四款配色,第一次采用曲面屏设计,同时背部采用了拼色设计(幻影青、暮光紫)。
    ———————-
    标题: 骁龙 8 Elite 旗舰芯片曝光,小米 15 系列手机将首发
    发布时间: 2024-09-26T16:39:22.507
    新闻简介: 科技媒体 smartprix 今天(9 月 26 日)发布博文,曝料称高通骁龙 8 Gen 4 芯片上市后,名称将叫做“骁龙 8 Elite”,搭载该芯片的小米 15 系列将于 10 月 23 日发布。
    ———————-
    标题: 力度新升级:全国可领政府 2000 元数码家电补贴,四川加码至高再省 4000 元
    发布时间: 2024-09-26T16:12:55.457
    新闻简介: 政府补贴无需回收旧物
    ———————-
    标题: 董宇辉回应直播带货“货不对板”:无法保证商家不夸大,出现问题第一时间售后
    发布时间: 2024-09-26T10:17:30.993
    新闻简介: 董宇辉表示,公司的做法是选品上播后会主动进行测,让员工用自己的地址正常下单,并进行部分送检,每个月都在这方面会花费不少的时间及费用。
    ———————-
    标题: 三只羊回应被罚 6894.91 万元:愿承担相关法律责任,将全面开展内部整顿
    发布时间: 2024-09-26T21:29:00.413
    新闻简介: 合肥三只羊网络科技有限公司今天晚间发布声明,就被罚 6894.91 万元进行回应,并就近期公司在直播中虚假宣传误导消费者的问题致歉。
    ———————-
    标题: 消息称阿里京东即将互相开放:淘宝接入京东物流,京东接入支付宝
    发布时间: 2024-09-26T17:19:30.11
    新闻简介: 而与此同时,京东也将正式接入支付宝支付,预计在双 11 前夕推出。目前消费者在京东下单,默认的支付方式排序依次为京东支付、云闪付、微信支付等。
    ———————-
    标题: “索尼 PS 之父”久多良木健:《黑神话:悟空》首月销量突破 2000 万份
    发布时间: 2024-09-26T13:03:33.963
    新闻简介: 也就是说,在不到一个月的时间内,《黑神话:悟空》又卖出了 1000 万份,在全球单机游戏史上也是一个不俗的成绩。#黑神话悟空销量突破2000万#
    ———————-

    —- IT之家新闻 End —-

  • 使用 nvm 管理 node 版本


    共计 682 个字符,预计需要花费 2 分钟才能阅读完成。

    在一台机器上想要安装不同版本的 node 通常是一件麻烦的事情,而 nvm 是一款 node 版本管理工具,允许用户通过命令行快速安装、切换和管理不同的 Node.js 版本。

    nvm 项目开源地址:https://github.com/nvm-sh/nvm

    需要注意的是 nvm 只适用于 macOS 和 Linux 系统,如果在 windows 上使用,则可以选择 nvm-windows

    首先需要进行安装:

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

    wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

    这里安装好后,nvm 还向 ~/.zshrc 写入了几行文件,需要重新加载一下环境变量:

    source ~/.zshrc

    然后就可以使用 nvm 进行管理 node 版本。

    # 查看版本安装所有版本
    nvm ls
    
    # 查看远程所有的 Node.js 版本
    nvm ls-remote
    
    # 安装指定的 Node.js 版本
    nvm install 21.7.3
    
    # 使用指定的 Node.js 版本
    nvm use 21.7.3
    
    # 设置默认 Node.js 版本
    nvm alias default 21.7.3

    另外有可能使用 nvm ls-remote 只显示 iojs,这可能是 nvm 镜像地址有问题,在 ~/.zshrc 加入以下内容,并重载配置文件即可。

    export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node

    Tips:清朝云网络工作室

  • ESlint9 + Prettier 配置教程


    共计 15114 个字符,预计需要花费 38 分钟才能阅读完成。

    在我还不知道如何从 0 开始配置ESlint的时候,ESlint已经更新到 9.x 了。而我还一直在用各种 cli 自动生成的ESlint配置,基本是ESlint@8.x版本。看着package.json中一大堆eslint依赖,不知道哪些有用哪些多余。本着不是最新我不用的原则,当我尝试升级到 ESlint9.x 时,却不是很顺利,因为ESlint@9.x配置上做了一些大改。折腾了几天之后,我发现,不如就从 0 开始认识ESlint@9.x吧!

    观前提示,本文中用到的项目是pnpmvitetypescriptvue@3.xESNext, 但是yarnnpmwebpackCommonJSvue@2.xreact依然适合。

    1、准备一个项目

    首先准备一个需要配置 ESlint 的项目,如果项目中已经有旧版本的 ESlint,那就先移除掉package.json中所有ESlint相关的依赖,因为我们要从 0 开始配置ESlint@9.x,顺便认识这个家伙。

    如果你的项目中有.eslintrc等配置,可以先保留这份文件,后面会用到,在你升级到最新版后,可以回来复用先前的规则配置,但是避免冲突,请先将其重命名,比如:__.eslintrc

    pnpm remove eslint eslint-plugin-vue ...

    什么,手上没项目?那先收藏起来,下次回来看。

    又或者可以用以下命令创建一个:

    pnpm create vite eslint-demo --template vue-ts

    什么,要我的 demo 源码?本文是教你如何学会使用 ESlint,能够在任何项目中上手配置。如果你的项目跟着我的教程安装配置之后,跑不起来。那要么是我说漏了,要么是你做漏了,欢迎评论区提出,我一定给你解决方案。

    2、项目安装和配置 ESlint

    首先我们先只需安装一个ESlint@9.x

    pnpm add eslint@latest -D

    然后你会在package.json中看到

    // package.json
    {
      "devDependencies": {
        "eslint": "^9.9.0"
      }
    }

    那么

    ESlint 在项目中是如何运行的呢?

    我们在项目中安装ESlint,最终是会通过命令pnpm lint 或者pnpm lint:fix 去执行,这个命令会用项目中安装的eslint去检查指定目录/文件的代码,最终输出不符合规则的代码错误信息。

    所以接下来就是要配置命令让ESlint起作用

    // package.json
    {
      "scripts": {
        "lint": "eslint",
        "lint:fix": "eslint --fix"
      },
      "devDependencies": {
        "eslint": "^9.9.0"
      }
    }

    然后我们试着执行一下

    pnpm lint

    不出意外的话,就要出意外了。是的没错,你会跟我一样输出以下错误:

    Oops! Something went wrong! :(
    ESLint: 9.9.0
    ESLint couldn't find an eslint.config.(js|mjs|cjs) file.
    From ESLint v9.0.0, the default configuration file is now eslint.config.js.
    If you are using a .eslintrc.* file, please follow the migration guide
    to update your configuration file to the new format:
    https://eslint.org/docs/latest/use/configure/migration-guide
    If you still have problems after following the migration guide, please stop by
    https://eslint.org/chat/help to chat with the team.
     ELIFECYCLE  Command failed with exit code 2.

    不要慌,这说明你的ESlint已经正确安装,命令也没有错。错的是我们确实一份ESlint配置文件,来告诉ESlint去校验哪些文件,用什么规则。

    所以我们需要在项目根目录中创建一份配置文件,从ESlint9.x开始,建议直接用eslint.config.jsESNext)或者eslint.config.mjsCommonJS)命名的配置文件。

    //eslint.config.js
    export default [
      {
        ignores: [
          'node_modules',
          'dist',
          'public',
        ],
      },
    ];

    因为我们的lint命令是没有指定目录或者指定文件类型的,默认eslit会去读取项目所有文件进行校验,所以我们需要在配置文件中使用ignores字段来告诉eslint排除哪些文件,这里也建议写在配置文件里面(更灵活),而不是写在命令那里(比较乱)。

    然后我们再来执行一下

    pnpm lint

    不出意外的话,是没有任何错误输出的,那么说明,eslint@9.x配置到这里已经算是成功了。

    3、规则定制

    接下来,我们就要开始定制一些规则,让那些初出茅庐的小伙伴,也能写一手标准的代码,让大家风格统一。

    3-1、JavaScript 规则

    因为ESlint是默认支持解析JavaScript的,以及有内置一些规则,所以我们只需启用相对于的规则名称就可以了。比如,我们不想在调试代码时在控制台看到各个小伙伴五花八门的 log 日志,非常影响自己调试代码,那么可以添加一下规则:

    // eslint.config.js
    export default [
      {
        ignores: [
          'node_modules',
          'dist',
          'public',
        ],
      },
      {
        rules: {
          'no-console': 'error',
        },
      },
    ];

    然后我们在项目中随便一个 js 文件写一个 console.log

    // xxx.js
    console.log('🌟🌟🌟🌟🌟TEO', a)

    再执行一下lint命令,这时你会看到以下错误

    (base) teo@Friday eslint-demo % pnpm lint
    > eslint-demo@0.0.0 lint /Users/teo/Code/temp/eslint-demo
    > eslint
    /Users/teo/Code/temp/eslint-demo/src/test.js
     1:1  error  Unexpected console statement  no-console
    ✖ 1 problem (1 error, 0 warnings)
     ELIFECYCLE  Command failed with exit code 1.

    是不是非常简单!你的ESlint配置已经在你的认知范围内起作用了🎉。

    你可以在这里找到更多的JavaScript规则。

    那么除了用error这么强势的启用,还有其他的提示吗?有的,规则可以是errorwarnoff

    相比于errorwarn只是警告,不会抛出错误,后面会讲到他们的作用。而off则是关闭该规则。

    到这里,机会有同学要问了,规则那么多,我要一条一条全部写出来吗?no no no,我们还可以用 ESlint 提供的现成的规则集,要用到@eslint/js这个依赖包。

    pnpm add @eslint/js -D
    // eslint.config.js
    import eslint from '@eslint/js';
    
    export default [
      {
        ignores: [
          'node_modules',
          'dist',
          'public',
        ],
      },
      eslint.configs.recommended,
    ];

    后面你会看到很多recommended,相信在旧的ESlint项目中你也会看到这些,这些一般都是相关开发者或者社区所推荐的规则,启用就对了。如果有些规则不是很符合你的项目需求,也可以off掉。

    到这一步,跟着我做的同学就会发现,eslint.configs.recommended 中并没有no-console规则,而且还提示'console' is not defined,别急,一步一步来。

    首先我们把no-console加回去,因为eslint.configs.recommende中并没有推荐no-console,除非你用eslint.configs.all

    // eslint.config.js
    import eslint from '@eslint/js';
    
    export default [
      {
        ignores: [
          'node_modules',
          'dist',
          'public',
        ],
      },
      eslint.configs.recommended,
      /**
       * JavaScript 规则
       */
      {
        rules: {
          'no-console': 'error',
        },
      },
    ];

    这里推荐每种规则都单独一个对象框起来,方便管理,因为后面还有vuetypescript等规则。

    3-2、启用隐藏的全局变量规则

    接下来说说为什么会提示'console' is not defined,这是因为eslint.configs.recommended 中启用了一条规则"no-undef": "error"console是全局变量,默认就可以直接使用,对于eslint来说,任何变量都需要定义,不管是否全局变量。这也可避免我们在项目中使用一些真的不存在的变量时导致出现一些低级错误。

    打个比方,你可以在任何浏览器环境执行alert(),但是你在nodejs环境中执行就会报错,nodejs中并没有该方法。

    所以eslint一视同仁,对于任何可用的隐藏全局变量,都需要跟eslint打声招呼。于是,我们可以用一个依赖包来配置所有全局变量,那就是globals

    pnpm add globals -D
    // eslint.config.js
    import eslint from '@eslint/js';
    import globals from 'globals';
    
    export default [
      {
        ignores: [
          'node_modules',
          'dist',
          'public',
        ],
      },
      eslint.configs.recommended,
      /**
       * JavaScript 规则
       */
      {
        rules: {
          'no-console': 'error',
        },
      },
      /**
       * 配置全局变量
       */
      {
        languageOptions: {
          globals: {
            ...globals.browser,
            /** 追加一些其他自定义全局规则 */
            wx: true,
          },
        },
      },
    ];

    这样就解决了隐藏的全局变量定义问题。

    这里只是告知eslint这些是全局变量,eslint便会去掉这些报错。而不是真的给你提供该变量,即便你欺骗eslint xxx 是全局变量,然后你去使用这个xxx时,代码逻辑依旧会报错的。 这里还适合一些通过 cdn 引入的全局变量,可以在这里配置,使用时eslint就不会报错了。

    3-3、Vue 规则

    相信配置完JavaScript的规则,你对ESlint已经有入门级的理解了,接下来我们对项目的vue文件进行规则配置。

    由于ESlint本身只支持识别JavaScript,所以对于vue文件,还需要一个插件:eslint-plugin-vue,假如你的项目也跟我一样用的是typescript,那么还需要另一个解析器:typescript-eslint

    pnpm add eslint-plugin-vue typescript-eslint -D
    // eslint.config.js
    import eslint from '@eslint/js';
    import globals from 'globals';
    import tseslint from 'typescript-eslint';
    import eslintPluginVue from 'eslint-plugin-vue';
    
    export default [
      {
        ignores: [
          'node_modules',
          'dist',
          'public',
        ],
      },
      eslint.configs.recommended,
      ...eslintPluginVue.configs['flat/recommended'],
      /**
       * JavaScript 规则
       */
      {
        rules: {
          'no-console': 'error',
        },
      },
      /**
       * 配置全局变量
       */
      {
        languageOptions: {
          globals: {
            ...globals.browser,
            /** 追加一些其他自定义全局规则 */
            wx: true,
          },
        },
      },
      /**
       * Vue 规则
       */
      {
        files: ['**/*.vue'],
        languageOptions: {
          parserOptions: {
            /** TypeScript 项目需要用到这个 */
            parser: tseslint.parser,
            ecmaVersion: 'latest',
            /** 允许在 .vue 文件中使用 JSX */
            ecmaFeatures: {
              jsx: true,
            },
          },
        },
        rules: {
          // 在这里追加 Vue 规则
          'vue/no-mutating-props': [
            'error',
            {
              shallowOnly: true,
            },
          ],
        },
      },
    ];

    这一步,我们使用了eslintPluginVue.configs['flat/recommended']作为 vue 的推荐规则配置。同时,里面还包含了vueESlint插件,用于解析vue文件,这也是ESlint配置为什么要大改的问题,因为它让ESlint配置更加简单了。

    同时,如果是typescript项目,需要在languageOptions.parserOptions中配置解析器来支持typescript

    规则中的files属性则用于指定匹配的后缀文件或者目录用此规则或者解析器。如果不写files,则该规则配置对所有文件起作用。

    这里还要注意规则的优先级问题,后面的规则会覆盖前面的规则,所以一般会把recommended写在最前面,然后后面再去关掉/启用一些其他规则。

    对于 vue 的更多规则配置,你可以在这里找到。

    3-4、TypeScript 规则

    上面我们已经安装了typescript-eslint用于对vue-ts的支持,那么它本身也是集成了typescriptrecommended配置以及ESlint插件的,即便你不是用在vue项目,也可以这样使用:

    import eslint from '@eslint/js';
    import globals from 'globals';
    import tseslint from 'typescript-eslint';
    import eslintPluginVue from 'eslint-plugin-vue';
    
    export default [
      {
        ignores: [
          'node_modules',
          'dist',
          'public',
        ],
      },
      /** JS 推荐配置 */
      eslint.configs.recommended,
      /** TS 推荐配置 */
      ...tseslint.configs.recommended,
      /** Vue 推荐配置 */
      ...eslintPluginVue.configs['flat/recommended'],
      /**
       * JavaScript 规则
       */
      {
        files: ['**/*.{js,mjs,cjs,vue}'],
        rules: {
          'no-console': 'error',
        },
      },
      /**
       * 配置全局变量
       */
      {
        languageOptions: {
          globals: {
            ...globals.browser,
            /** 追加一些其他自定义全局规则 */
            wx: true,
          },
        },
      },
      /**
       * Vue 规则
       */
      {
        files: ['**/*.vue'],
        languageOptions: {
          parserOptions: {
            /** TypeScript 项目需要用到这个 */
            parser: tseslint.parser,
            ecmaVersion: 'latest',
            /** 允许在 .vue 文件中使用 JSX */
            ecmaFeatures: {
              jsx: true,
            },
          },
        },
        rules: {
          // 在这里追加 Vue 规则
          'vue/no-mutating-props': [
            'error',
            {
              shallowOnly: true,
            },
          ],
        },
      },
      /**
       * TypeScript 规则
       */
      {
        files: ['**/*.{ts,tsx,vue}'],
        rules: {
          // 在这里追加 TypeScript 规则
        },
      },
    ];

    vueeslintPluginVue.configs['flat/recommended']一样,tseslint.configs.recommended也会在配置中自动添加插件和规则。

    这里我们既然用到了typescript-eslint这个插件,那么我们还可以用tseslint.config这个函数,来让配置有文件有代码提示,避免写错。

    import eslint from '@eslint/js';
    import globals from 'globals';
    import tseslint from 'typescript-eslint';
    import eslintPluginVue from 'eslint-plugin-vue';
    import stylistic from '@stylistic/eslint-plugin';
    
    export default tseslint.config(
      {
        ignores: [
          'node_modules',
          'dist',
          'public',
        ],
      },
      /** JS 推荐配置 */
      eslint.configs.recommended,
      /** TS 推荐配置 */
      ...tseslint.configs.recommended,
      /** Vue 推荐配置 */
      ...eslintPluginVue.configs['flat/recommended'],
      /** Stylistic 自定义规则 */
      stylistic.configs.customize({
        indent: 2,
        quotes: 'single',
        semi: false,
        jsx: true,
        braceStyle: '1tbs',
        arrowParens: 'always',
      }),
      /**
       * JavaScript 规则
       */
      {
        files: ['**/*.{js,mjs,cjs,vue}'],
        rules: {
          'no-console': 'error',
        },
      },
      /**
       * 配置全局变量
       */
      {
        languageOptions: {
          globals: {
            ...globals.browser,
            /** 追加一些其他自定义全局规则 */
            wx: true,
          },
        },
      },
      /**
       * Vue 规则
       */
      {
        files: ['**/*.vue'],
        languageOptions: {
          parserOptions: {
            /** TypeScript 项目需要用到这个 */
            parser: tseslint.parser,
            ecmaVersion: 'latest',
            /** 允许在 .vue 文件中使用 JSX */
            ecmaFeatures: {
              jsx: true,
            },
          },
        },
        rules: {
          // 在这里追加 Vue 规则
          'vue/no-mutating-props': [
            'error',
            {
              shallowOnly: true,
            },
          ],
        },
      },
      /**
       * TypeScript 规则
       */
      {
        files: ['**/*.{ts,tsx,vue}'],
        rules: {
          // 这里可以添加 TypeScript 相关的规则
        },
      },
    ); 

    对于typescript的更多规则配置,你可以在这里找到。

    这里还推荐用@stylistic/eslint-plugin这个插件来提供更多的typescriptJavaScript的语法风格规则:

    pnpm add @stylistic/eslint-plugin -D
    import eslint from '@eslint/js';
    import globals from 'globals';
    import tseslint from 'typescript-eslint';
    import eslintPluginVue from 'eslint-plugin-vue';
    import stylistic from '@stylistic/eslint-plugin';
    
    export default tseslint.config(
      {
        ignores: [
          'node_modules',
          'dist',
          'public',
        ],
      },
      /** JS 推荐配置 */
      eslint.configs.recommended,
      /** TS 推荐配置 */
      ...tseslint.configs.recommended,
      /** Vue 推荐配置 */
      ...eslintPluginVue.configs['flat/recommended'],
      /** Stylistic 自定义规则 */
      stylistic.configs.customize({
        indent: 2,
        quotes: 'single',
        semi: false,
        jsx: true,
        braceStyle: '1tbs',
        arrowParens: 'always',
      }),
      /**
       * JavaScript 规则
       */
      {
        files: ['**/*.{js,mjs,cjs,vue}'],
        rules: {
          'no-console': 'error',
        },
      },
      /**
       * 配置全局变量
       */
      {
        languageOptions: {
          globals: {
            ...globals.browser,
            /** 追加一些其他自定义全局规则 */
            wx: true,
          },
        },
      },
      /**
       * Vue 规则
       */
      {
        files: ['**/*.vue'],
        languageOptions: {
          parserOptions: {
            /** TypeScript 项目需要用到这个 */
            parser: tseslint.parser,
            ecmaVersion: 'latest',
            /** 允许在 .vue 文件中使用 JSX */
            ecmaFeatures: {
              jsx: true,
            },
          },
        },
        rules: {
          // 在这里追加 Vue 规则
          'vue/no-mutating-props': [
            'error',
            {
              shallowOnly: true,
            },
          ],
        },
      },
      /**
       * TypeScript 规则
       */
      {
        files: ['**/*.{ts,tsx,vue}'],
        rules: {
          // 这里可以添加 TypeScript 相关的规则
        },
      },
    );

    好了,到这里如果不出意外的话,恭喜你,入门ESlint了,你已经知道 ESlint 是如何去解析每个不同类型的文件了。

    当你入门 ESlint 之后,还可以尝试去添加一些其他文件格式的规则,比如JsonMarkdownHtml,去搜一下相关的插件,相信你很容易就上手了。

    二、编辑器中的 ESlint

    讲完项目中的ESlint,接下来说说开发者工具(VS Code)中的ESlint

    为什么我项目中已经安装了ESlint,还要在 vscode 中安装ESlint扩展呢?

    VS Code 中的ESlint,本质是可以在你编写代码时,实时看到代码中不符合项目ESlint规则配置的错误,比如这样:

    ESlint9 + Prettier 配置教程

    />

    那就有同学要问了,为什么不让大家在vscode中都安装一个ESlint扩展,项目中就不需要了。

    其实他们两者使用场景都不一样,项目中安装了ESlint,我们可以在脱离了vscode之后,去实现一些其他功能。

    比如,在自动化部署时,运行pnpm lint来确认代码是否存在问题,或者在提交代码时,通过husky来阻止存在ESlint问题的代码提交。

    vscode中的ESlint,本质是在你开发时可以立马找到错误的代码位置进行改正修复。

    1、ESlint 扩展安装

    首先,需要在vscode中安装ESlint扩展插件,安装完后可能要重启vscode来生效。

    ESlint9 + Prettier 配置教程

    />

    2、ESlint 扩展如何运作

    ESlint扩展会优先去查找项目根目录中的eslint.config.js 配置文件,并且包括配置文件所提到的ESlint插件,也就是npm依赖包,是的没错,ESlint扩展本身所需的ESlint 版本和ESlint插件,都是来自于node_modules,你可以试着把这个目录删了,vscode中的ESlint扩展就会报错,无法运行。

    但你启用vscode中的ESlint扩展之后,并不会对所有文件生效,你还需要配置ESlint扩展的设置来对所需的文件启用校验。

    这里建议为每个项目单独添加 vscode 独有的设置,也就是项目根目录中创建一个.vscode目录,里面放置一个settings.json文件,这样vscode就会优先读取该设置:

    // .vscode/settings.json
    {
      "eslint.validate": [
        "javascript",
        "vue",
        "vue-html",
        "typescript",
        "typescriptreact",
        "html",
        "css",
        "scss",
        "less",
        "json",
        "jsonc",
        "json5",
        "markdown"
      ]
    }

    这样一来,配置中所提到的文件格式,都会被ESlint扩展识别。

    到这里,ESlint 基本算是可以正常使用了,但是,还没完,prettier还没讲呢!

    三、Prettier 安装和配置

    Prettier是什么?其实很多人都认识它,它就是一个 vscode 扩展,用于格式化代码。但是用过 ESlint 的人对它又爱又恨,没错它会跟 ESlint 冲突。那么我来讲讲它们是如何冲突,又要如何解决。

    1、Prettier 如何运作

    prettier扩展会读取项目根目录中的.prettierrc.prettierrc.js之类的配置文件,然后你在 vscode 中用prettier执行格式化时,会根据配置文件的要求对代码进行格式化。

    那么问题来着,格式化后的结果,有时跟ESlint的要求是不一样的,比如ESlint要求这个属性要换行,prettier要求这个属性不换行。好了,你代码是格式化的漂漂亮亮了,但是 ESlint 不乐意啊,它就给你报红。怎么办呢?

    2、解决 Prettier 跟 ESlint 冲突

    为了解决两者的冲突,我们要使用另一个ESlint插件eslint-plugin-prettier

    eslint-plugin-prettier这个插件不仅提供文件解析,代码fix,也顺带提供了一些规则配置,比如它会把跟prettier冲突的ESlint规则给off掉,并使用自己的规则,也就是说,二选一,让你选prettier。为什么是prettier呢,prettier其实只是提供代码风格的规范,也是目前主流的一个风格规范,那我们就跟着主流呗。其他代码逻辑的规范,就交给ESlint

    pnpm add eslint-plugin-prettier -D
    import eslint from '@eslint/js';
    import globals from 'globals';
    import tseslint from 'typescript-eslint';
    import eslintPluginVue from 'eslint-plugin-vue';
    import stylistic from '@stylistic/eslint-plugin';
    import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
    
    export default tseslint.config(
      {
        ignores: [
          'node_modules',
          'dist',
          'public',
        ],
      },
      /** JS 推荐配置 */
      eslint.configs.recommended,
      /** TS 推荐配置 */
      ...tseslint.configs.recommended,
      /** Vue 推荐配置 */
      ...eslintPluginVue.configs['flat/recommended'],
      /** Stylistic 自定义规则 */
      stylistic.configs.customize({
        indent: 2,
        quotes: 'single',
        semi: false,
        jsx: true,
        braceStyle: '1tbs',
        arrowParens: 'always',
      }),
      /**
       * JavaScript 规则
       */
      {
        files: ['**/*.{js,mjs,cjs,vue}'],
        rules: {
          'no-console': 'warn',
        },
      },
      /**
       * 配置全局变量
       */
      {
        languageOptions: {
          globals: {
            ...globals.browser,
            /** 追加一些其他自定义全局规则 */
            wx: true,
          },
        },
      },
      /**
       * Vue 规则
       */
      {
        files: ['**/*.vue'],
        languageOptions: {
          parserOptions: {
            /** TypeScript 项目需要用到这个 */
            parser: tseslint.parser,
            ecmaVersion: 'latest',
            /** 允许在 .vue 文件中使用 JSX */
            ecmaFeatures: {
              jsx: true,
            },
          },
        },
        rules: {
          // 在这里追加 Vue 规则
          'vue/no-mutating-props': [
            'error',
            {
              shallowOnly: true,
            },
          ],
        },
      },
      /**
       * TypeScript 规则
       */
      {
        files: ['**/*.{ts,tsx,vue}'],
        rules: {
          // 这里可以添加 TypeScript 相关的规则
        },
      },
      /**
       * Prettier 配置
       * 会合并根目录下的 prettier.config.js 文件
       * @see https://prettier.io/docs/en/options
       */
      eslintPluginPrettierRecommended,
    );

    这里仅仅是添加一句eslint-plugin-prettier/recommended,非常简单对吧,它的作用是off与它冲突的ESlint规则,并且启用自己的Recommended规则,并且它会自动合并prettier.config.js配置,所以我们还需要在根目录创建一份prettier.config.js,配置如下,可根据自己的需求调整配置。

    // prettier.config.js
    /**
     * @type {import('prettier').Config}
     * @see https://www.prettier.cn/docs/options.html
     */
    export default {
      trailingComma: 'all',
      singleQuote: true,
      semi: false,
      printWidth: 80,
      arrowParens: 'always',
      proseWrap: 'always',
      endOfLine: 'lf',
      experimentalTernaries: false,
      tabWidth: 2,
      useTabs: false,
      quoteProps: 'consistent',
      jsxSingleQuote: false,
      bracketSpacing: true,
      bracketSameLine: false,
      jsxBracketSameLine: false,
      vueIndentScriptAndStyle: false,
      singleAttributePerLine: false,
    };

    这里单独一份prettier.config.js而不是写进ESlint配置里面,是因为vscodeprettier扩展需要根据它的配置来格式化你的代码。

    到这里,vscodeprettier扩展在格式化代码时,就会解决掉大部分ESlint报错,剩下的错误需要你自己手动改一改。

    有同学又又要问了,为什么不用Prettier ESLint这个扩展来格式化代码。

    ESlint9 + Prettier 配置教程

    />

    很抱歉,截止目前,它似乎还是不支持ESlint9.x,这也是我改用prettier的原因,也折腾了很久才明白怎么用ESlint

    总结

    总而言之,使用 ESlint 只需以下几个步骤,就可以完成

    1、依赖包安装

    pnpm add eslint @eslint/js globals typescript-eslint eslint-plugin-vue @stylistic/eslint-plugin eslint-plugin-prettier -D

    2、创建或者复制已有项目的配置

    // eslint.config.js
    import eslint from '@eslint/js';
    import globals from 'globals';
    import tseslint from 'typescript-eslint';
    import eslintPluginVue from 'eslint-plugin-vue';
    import stylistic from '@stylistic/eslint-plugin';
    import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
    
    export default tseslint.config(
      {
        ignores: [
          'node_modules',
          'dist',
          'public',
        ],
      },
      /** JS 推荐配置 */
      eslint.configs.recommended,
      /** TS 推荐配置 */
      ...tseslint.configs.recommended,
      /** Vue 推荐配置 */
      ...eslintPluginVue.configs['flat/recommended'],
      /** Stylistic 自定义规则 */
      stylistic.configs.customize({
        indent: 2,
        quotes: 'single',
        semi: false,
        jsx: true,
        braceStyle: '1tbs',
        arrowParens: 'always',
      }),
      /**
       * JavaScript 规则
       */
      {
        files: ['**/*.{js,mjs,cjs,vue}'],
        rules: {
          'no-console': 'warn',
        },
      },
      /**
       * 配置全局变量
       */
      {
        languageOptions: {
          globals: {
            ...globals.browser,
            /** 追加一些其他自定义全局规则 */
            wx: true,
          },
        },
      },
      /**
       * Vue 规则
       */
      {
        files: ['**/*.vue'],
        languageOptions: {
          parserOptions: {
            /** TypeScript 项目需要用到这个 */
            parser: tseslint.parser,
            ecmaVersion: 'latest',
            /** 允许在 .vue 文件中使用 JSX */
            ecmaFeatures: {
              jsx: true,
            },
          },
        },
        rules: {
          // 在这里追加 Vue 规则
          'vue/no-mutating-props': [
            'error',
            {
              shallowOnly: true,
            },
          ],
        },
      },
      /**
       * TypeScript 规则
       */
      {
        files: ['**/*.{ts,tsx,vue}'],
        rules: {
          // 这里可以添加 TypeScript 相关的规则
        },
      },
      /**
       * Prettier 配置
       * 会合并根目录下的 .prettier.config.js 文件
       * @see https://prettier.io/docs/en/options
       */
      eslintPluginPrettierRecommended,
    );
    // prettier.config.js
    /**
     * @type {import('prettier').Config}
     * @see https://www.prettier.cn/docs/options.html
     */
    export default {
      trailingComma: 'all',
      singleQuote: true,
      semi: false,
      printWidth: 80,
      arrowParens: 'always',
      proseWrap: 'always',
      endOfLine: 'lf',
      experimentalTernaries: false,
      tabWidth: 2,
      useTabs: false,
      quoteProps: 'consistent',
      jsxSingleQuote: false,
      bracketSpacing: true,
      bracketSameLine: false,
      jsxBracketSameLine: false,
      vueIndentScriptAndStyle: false,
      singleAttributePerLine: false,
    };
    // .vscode/settings.json
    {
      "eslint.validate": [
        "javascript",
        "vue",
        "vue-html",
        "typescript",
        "typescriptreact",
        "html",
        "css",
        "scss",
        "less",
        "json",
        "jsonc",
        "json5",
        "markdown"
      ]
    }
    // package.json
    {
      "scripts": {
        "lint": "eslint",
        "lint:fix": "eslint --fix"
      },
      "devDependencies": {
        "eslint": "^9.9.0"
      }
    }

    本文转载自:2024年|ESlint9+Prettier从0开始配置教程

    Tips:清朝云网络工作室

  • Springboot 使用 nacos 时固定注册 ip


    共计 195 个字符,预计需要花费 1 分钟才能阅读完成。

    最近使用 idea 开发 springboot 项目时,经常遇到注册 nacos 的 ip 为 169.xx.xx.xx 的问题。之前有过多网卡上送时 ip 不对的问题,但是把对应网卡禁用就好了。

    这次无论是重启项目或者是电脑,还是禁用网卡都不好用,想想只是为了本地开发使用,于是直接修改本地配置文件好了:

    spring:
      cloud:
        nacos:
          discovery:
            ip: 172.21.9.171
            #port: 30010

    Tips:清朝云网络工作室

  • WordPress视频播放器

    前言

    • 一些WordPress主题自带的播放器是第三方播放器并不能播放随机视频只能播放固定链接视频。
    • 此代码只需要在WordPress文章编辑器 中选择文本,然后粘贴进去,支持视频播放完继续随机播放下一个视频。
    • 所以一定要把其中两条https://your-random-video-api.com更改成自己的API。

    代码

    <video id="random-video" controls autoplay>
      <source src="https://your-random-video-api.com" type="video/mp4">
    </video>
    
    <script>
      const video = document.getElementById('random-video');
      video.addEventListener('ended', () => {
        const source = document.querySelector('source');
        source.setAttribute('src', 'https://your-random-video-api.com');
        video.load();
        video.play();
      });
    </script>
  • WordPress底部添加当前在线人数统计

    教程

    将下面的代码放到当前主题的footer.php文件中,记得在目录中创建一个名为maplers.dat 的文件。

    代码

    <!--显示在线人数-->
    <?php
    //首先你要有读写文件的权限,首次访问肯不显示,正常情况刷新即可
    $online_log = "maplers.dat"; //保存人数的文件到根目录,
    $timeout = 60;//60秒内没动作,认为掉线
    $entries = file($online_log);
    $temp = array();
    for ($i=0;$i<count($entries);$i++){
    $entry = explode(",",trim($entries[$i]));
    if(($entry[0] != getenv('REMOTE_ADDR')) && ($entry[1] > time())) {
    array_push($temp,$entry[0].",".$entry[1]."n"); //取出其他浏览者的信息,并去掉超时者,保存进$temp
    }}
    array_push($temp,getenv('REMOTE_ADDR').",".(time() + ($timeout))."n"); //更新浏览者的时间
    $maplers = count($temp); //计算在线人数
    $entries = implode("",$temp);
    //写入文件
    $fp = fopen($online_log,"w");
    flock($fp,LOCK_EX); //flock() 不能在NFS以及其他的一些网络文件系统中正常工作
    fputs($fp,$entries);
    flock($fp,LOCK_UN);
    fclose($fp);
    echo "在线人数:".$maplers."人";
    ?>