发布于 2026-01-06 0 阅读
0

9 个意想不到的 Web 开发技巧:1. 获取当前时间戳;2. 检测长按;3. 对对象数组进行排序;4. 组件间通信;5. 对象数组的深拷贝和浅拷贝;6. 复制到剪贴板;7. 一个 npm 命令搞定所有;8. 优化 SVG 文件;9. 在 Chrome 中检查 WebSocket 消息。

9 个出人意料的网站开发技巧和窍门

1. 获取当前时间戳

2. 检测长按

3. 对对象数组进行排序

4. 组件间通信

5. 对象数组的深拷贝和浅拷贝

6. 复制到剪贴板

7. 一条 npm 命令即可统领所有

8. 优化 SVG 文件

9. 在 Chrome 浏览器中检查 WebSocket 消息

在本文中,我总结了近期使用过的 9 个网页开发技巧和窍门。虽然内容主要面向初学者,但我希望它也能对经验丰富的开发者有所帮助。

1. 获取当前时间戳

我发现这个简写方式很有意思,尤其有助于理解幕后发生的事情:

const ts = + new Date(); // Same as (new Date()).getTime()

console.log(ts);
// 1576178666126

演示:https://codepen.io/armelpingault/pen/eYmBzEG

根据文档

valueOf()方法返回指定对象的基本类型值。简写形式是在变量名前加上加号(+)。

如果您需要回顾一下什么是原始值

在 JavaScript 中,原始类型(原始值、原始数据类型)是指非对象且没有方法的数据。共有 7 种原始数据类型:字符串 (string)、数字 (number)、大整数 (bigint)、布尔值 (boolean)、null、undefined 和符号 (symbol)。

2. 检测长按

我有一个按钮,它应该根据用户交互触发两种不同的操作:普通点击触发一种操作,长按按钮触发另一种操作:

const btn = document.querySelector('button');
let timer;

btn.addEventListener('mousedown', (e) => {
  timer = + new Date();
});

btn.addEventListener('mouseup', (e) => {
  if (+ new Date() - timer < 500) {
    console.log('click');
  } else {
    console.log('long press');
  };
});

演示:https://codepen.io/armelpingault/pen/rNaLpLE

3. 对对象数组进行排序

这是一个经典问题,我们经常需要根据对象某个属性的值对对象数组进行排序。

const arr = [
  {name: 'Jacques', age: 32},
  {name: 'Paul', age: 45},
  {name: 'Pierre', age: 20}
];

arr.sort((firstEl, secondEl) => firstEl.age - secondEl.age);
// [{name: 'Pierre', age: 20}, {name: 'Jacques', age: 32}, {name: 'Paul', age: 45}]

// And if you want to sort in descending order:

arr.sort((firstEl, secondEl) => secondEl.age - firstEl.age);
// [{name: 'Paul', age: 45}, {name: 'Jacques', age: 32}, {name: 'Paul', age: 20}]

演示:https://codepen.io/armelpingault/pen/zYxoBPW

另请注意,使用sort()函数时,数组会就地排序,不会进行复制。

4. 组件间通信

当需要两个 JavaScript 组件相互通信时,我有时最终会实现一个自定义事件

const el = document.createElement('div');
const btn = document.querySelector('button');

const event = new CustomEvent('sort', {
  detail: {
    by: 'name'
  }
});

btn.addEventListener('click', () => {
  el.dispatchEvent(event);
});

el.addEventListener('sort', (e) => {
  console.log('Sort by', e.detail.by);
});

演示:https://codepen.io/armelpingault/pen/gObLazb

5. 对象数组的深拷贝和浅拷贝

这个话题本身就值得写一整篇文章,你会发现成千上万篇文章都在讨论它,但几天前我和一位同事讨论过这个问题,所以我想在这里再提醒大家一下。

当您需要创建对象数组的副本时,很容易会想到这样
做:

const arr1 = [{a: 1, b: 2}, {c: 3, d: 4}];
const arr2 = arr1;

但是,这只是复制对原始对象的引用,如果您修改了原始对象arr1,那么arr2原始对象也会被修改。

const arr1 = [{a: 1, b: 2}, {c: 3, d: 4}];
const arr2 = arr1;
arr1[1].c = 9;

console.log(arr2);
// [{a: 1, b: 2}, {c: 9, d: 4}];

演示:https://codepen.io/armelpingault/pen/OJPbXEy

使用扩展运算符可以创建数组的浅拷贝。这将创建一个新数组,但会保留对原数组对象的引用。

const arr1 = [{a: 1, b: 2}, {c: 3, d: 4}];
const arr2 = [...arr1];

arr1.push({e: 5, f: 6});
arr1[0].a = 8;

console.log(arr2);
// [{a: 8, b: 2}, {c: 3, d: 4}];

演示:https://codepen.io/armelpingault/pen/GRgNqBg

如您所见,向中添加新元素arr1并不会改变现有元素arr2。但是,如果我修改现有元素内部的对象arr1,那么我们也会在现有元素内部看到相应的变化arr2

如果我想对数组进行深拷贝,可以这样做:

const arr1 = [{a: 1, b: 2}, {c: 3, d: 4}];
const arr2 = JSON.parse(JSON.stringify(arr1));
arr[1].d = 6;

console.log(arr1);
// [{a: 1, b: 2}, {c: 3, d: 6}];

console.log(arr2);
// [{a: 1, b: 2}, {c: 3, d: 4}];

演示:https://codepen.io/armelpingault/pen/BayQzOK

在这种情况下,我可以看到,无论我如何更改arr1,都不会对产生任何影响arr2

请注意,使用JSON.stringify时,对象实例(包括 Map、Set、WeakMap 和 WeakSet)只会序列化其可枚举属性。

6. 复制到剪贴板

<textarea>这是我用来将文件内容复制到剪贴板的一小段代码:

const textarea = document.querySelector('textarea');

const copy = () => {
  textarea.select();
  document.execCommand('copy');
  alert('Content popied to clipboard!');
};

textarea.addEventListener('click', copy);

演示:https://codepen.io/armelpingault/pen/jOEVrQw

此外,剪贴板 API还提供了更多操作剪贴板的选项。然而,它仍处于实验阶段,浏览器支持度仍然很低

剪贴板 API 浏览器支持

7. 一条 npm 命令即可统领所有

我非常喜欢部署命令只有一行的项目,无论是开发环境还是生产环境。

最近在做项目的时候,我发现我们需要两条命令来启动开发环境,一条在服务器文件夹下,一条在客户端文件夹下。显然,我们需要把这两条命令合并成一条,然后从根文件夹运行。

Projects
|
|-- client
|      package.json
|
|-- server
|      package.json
|
package.json

多亏了 npm 包concurrently,我们才能同时运行多个 npm 命令。

// After installing the npm package
npm install --save-dev concurrently

// You should now see it in your package.json
"devDependencies": {
  "concurrently": "^5.0.0"
}

// Then add the "master" command to the root package.json
"scripts": {
    "start": "concurrently \"npm start --prefix ./client\" \"npm start --prefix ./server\"",
}

--prefix选项将在您选择的子文件夹中运行任何 npm 命令:

npm run build --prefix ./client

8. 优化 SVG 文件

我们每天都会大量使用 SVG 图标,这些图标通常由网页设计机构或客户的网页设计部门提供。

很多SVG图像实际上是用Adobe Illustrator等软件创建和生成的。虽然这些软件是创建图形设计的好工具,但如果你不注意导出设置,它们也会在SVG文件中生成很多额外的无用标记。

为了优化我的 SVG 文件,我使用了SVG Optimizer,它很容易集成到你的项目中:

// Install SVGO globally
npm install -g svgo

// Optimize all SVG file from -f "folder" to -o "folder"
svgo -f assets/src/svg -o assets/dist/svg

上次运行后,我测得所有文件的大小平均减少了约 30%……还不错!

9. 在 Chrome 浏览器中检查 WebSocket 消息

本文的最后一个技巧,我将重新发布我在 StackOverflow 上写的一个答案,这个答案是我在开发实时 Web 应用程序时需要的。

  1. 打开Chrome开发者工具
  2. 点击“网络”选项卡。
  3. 点击筛选器WS(用于 WebSocket)。
  4. 重新加载页面,确保在“名称”列中看到您的连接。
  5. 点击“消息”

现在您应该可以看到所有与 WebSocket 的通信,分为 3 列:数据、长度和时间。

Chrome 开发者工具

如果您还有其他想与大家分享的网页开发技巧和窍门,欢迎在评论区留言 ;)

文章来源:https://dev.to/armelpingault/9-web-development-tips-and-tricks-out-of-the-blue-119i