无需(构建)工具的 Web 开发

无需(构建)工具的 web 开发

当开始一个将使用 javascript 的新 web 项目时,我们做的第一件事通常是设置构建和开发人员工具。比如最近很火的vite。您可能不知道并非所有 javascript(web)项目都需要复杂的构建工具。事实上,正如我将在本文中展示的那样,现在比以往任何时候都更容易摆脱困境。

使用index.html文件创建一个新项目。

          

hello world

如果您使用的是 vs code,请安装实时预览扩展。运行。这是一个具有实时重新加载功能的简单文件服务器。你可以使用任何文件服务器,python 内置了一个:

python3 -m http.server

我喜欢实时预览,因为它在更改文件后会自动刷新页面。

您现在应该能够从浏览器访问您的index.html 文件并看到“hello world”。

接下来,创建一个index.js文件:

console.log("hello world");export {};

将其包含在您的index.html中:


在浏览器中打开开发者控制台。如果你看到“hello world”,你就知道它正在正确加载。

浏览器现在支持 ecmascript 模块。您可以导入其他文件以消除其副作用:

import "./some-other-script.js";

或用于出口

import { add, multiply } "./my-math-lib.js";

很酷吧?请参阅上面的 mdn 指南以获取更多信息。

套餐

你可能不想重新发明轮子,所以你的项目可能会使用一些第三方包。这并不意味着您现在需要开始使用包管理器。

假设我们想使用超级结构进行数据验证。我们不仅可以从我们自己的(本地)文件服务器加载模块,还可以从任何 url 加载模块。 esm.sh 方便地为 npm 上可用的几乎所有包提供模块。

当您访问 https://esm.sh/superstruct 时,您可以看到您被重定向到最新版本。您可以在代码中包含此包,如下所示:

import { assert } from "https://esm.sh/superstruct";

如果你想安全起见,你可以固定版本。

类型

我不了解你,但 typescript 宠坏了我(并且让我变得懒惰)。在没有类型检查器帮助的情况下编写纯 javascript 感觉就像走钢丝一样。幸运的是,我们也不必放弃类型检查。

是时候淘汰 npm 了(尽管我们不会发布它提供的任何代码)。

npm init --yesnpm install typescript

您可以在 javascript 代码上使用 typescript 编译器!它有一流的支持。创建jsconfig.json:

{  "compileroptions": {    "strict": true,    "checkjs": true,    "allowjs": true,    "noimplicitany": true,    "lib": ["es2022", "dom"],    "module": "es2022",    "target": "es2022"  },  "include": ["**/*.js"],  "exclude": ["node_modules"]}

现在就跑吧

npm run tsc --watch -p jsconfig.json

并在代码中犯下类型错误。 typescript 编译器应该抱怨:

/** @type {number} **/const num = "hello";

顺便说一下,你上面看到的评论是jsdoc。您可以通过这种方式用类型注释您的 javascript。虽然它比使用 typescript 更冗长一些,但你很快就会习惯它。它也非常强大,只要您不编写疯狂的类型(对于大多数项目来说您不应该这样做),您应该没问题。

如果您确实需要复杂的类型(助手),您可以随时在 .d.ts 文件中添加一些 typescript。

jsdoc 是否只是那些陷入大型 javascript 项目的人们能够逐步迁移到 typescript 的垫脚石?我不这么认为! typescript 团队还继续向 jsdoc + typescript 添加出色的功能,例如即将发布的 typescript 版本。自动完成在 vs code 中也非常有效。

导入地图

我们学习了如何在没有构建工具的情况下将外部包添加到我们的项目中。然而,如果你将代码分成很多模块,一遍又一遍地写出完整的 url 可能会有点冗长。

我们可以将导入映射添加到我们的index.html的head部分:

  {    "imports": {      "superstruct": "https://esm.sh/superstruct@1.0.4"    }  }

现在我们可以简单地使用
导入这个包

import {} from "superstruct"

就像一个“正常”项目。另一个好处是,如果您在本地安装该软件包,类型的完成和识别将按预期工作。

npm install --save-dev superstruct

请注意,您的node_modules目录中的版本将不会被使用。您可以将其删除,您的项目将继续运行。

我喜欢使用的一个技巧是添加:

      "cdn/": "https://esm.sh/",

到我的导入地图。然后,通过 esm.sh 提供的任何项目都可以通过简单地导入来使用。例如:

import peer from "cdn/peerjs";

如果您也想从node_modules中提取类型以进行此类导入的开发,则需要将以下内容添加到jsconfig.json的compileroptions中:

    "paths": {      "cdn/*": ["./node_modules/*", "./node_modules/@types/*"]    },

部署

要部署您的项目,请将所有文件复制到静态文件主机,然后就完成了!如果您曾经参与过旧版 javascript 项目,您就会知道更新不到 1-2 年的构建工具的痛苦。通过此项目设置,您将不会遭受同样的命运。

测试

如果您的 javascript 不依赖于浏览器 api,您可以只使用与 node.js 捆绑在一起的测试运行器。但为什么不编写自己的可以在浏览器中运行的测试运行器呢?

/** @type {[string, () => promise | void][]} */const tests = [];/** * * @param {string} description * @param {() => promise | void} testfunc */export async function test(description, testfunc) {  tests.push([description, testfunc]);}export async function runalltests() {  const main = document.queryselector("main");  if (!(main instanceof htmlelement)) throw new error();  main.innerhtml = "";  for (const [description, testfunc] of tests) {    const newspan = document.createelement("p");    try {      await testfunc();      newspan.textcontent = `✅ ${description}`;    } catch (err) {      const errormessage =        err instanceof error && err.message ? ` - ${err.message}` : "";      newspan.textcontent = `❌ ${description}${errormessage}`;    }    main.appendchild(newspan);  }}/** * @param {any} val */export function assert(val, message = "") {  if (!val) throw new error(message);}

现在创建一个文件 example.test.js.

import { test, assert } from "@/test.js";test("1+1", () => {  assert(1 + 1 === 2);});

还有一个导入所有测试的文件:

import "./example.test.js";console.log("this should only show up when running tests");

在页面加载时运行:

await import("@/test/index.js"); // file that imports all tests(await import("@/test.js")).runAllTests();

您就拥有了完美的 tdd 设置。要仅运行一部分测试,您可以注释掉一些 .test.js 导入,但只有当您积累了大量测试时,测试执行速度才会开始成为问题。

好处

你为什么要这样做?那么,使用较少的抽象层可以使您的项目更易于调试。还有“利用平台”的信条。您学到的技能将更好地转移到其他项目中。另一个优点是,当你在 10 年后回到这样构建的项目时,它仍然可以正常工作,并且你不需要进行考古来尝试恢复已经失效 8 年的构建工具。许多从事遗留项目的 web 开发人员都会熟悉这种经历。

请访问 plainvanillaweb.com 了解更多想法。

以上就是无需(构建)工具的 Web 开发的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1489990.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JavaScript 中的对象解构
上一篇 2025年12月19日 12:51:46
卢迪亚纳的全栈网站开发课程
下一篇 2025年12月19日 12:52:10

相关推荐

  • VSCode怎样利用断点条件设置排除特定用户场景 VSCode断点条件排除特定场景的创新调试方法​

    在vscode中设置断点条件的方法是:1. 点击行号设置断点;2. 右键选择“编辑断点”并输入返回布尔值的条件表达式;3. 使用逻辑非运算符!排除特定用户场景,如userid !== 123;4. 排除多个用户时使用!(userid === 123 || userid === 456)等逻辑组合;5…

    2026年10月7日
    100
  • TXT小说如何去除广告或杂质_TXT小说去除广告和多余内容操作

    TXT小说如何去除广告或杂质_TXT小说去除广告和多余内容操作TXT小说如何去除广告或杂质_TXT小说去除广告和多余内容操作TXT小说如何去除广告或杂质_TXT小说去除广告和多余内容操作TXT小说如何去除广告或杂质_TXT小说去除广告和多余内容操作

    使用文本编辑器手动清理或专用工具自动处理可有效去除TXT小说中的广告、乱码和冗余内容,提升阅读体验。 很多TXT小说文件在下载后会夹杂大量广告、乱码、推广信息或多余的章节标题,影响阅读体验。要清理这些杂质,可以手动或借助工具高效处理。以下是几种实用方法。 使用文本编辑器手动清理 对于内容较少或只有一…

    2026年10月7日 • 用户投稿
    400
  • Java调用Python脚本的几种实现方式对比

    Java调用Python脚本的几种实现方式对比Java调用Python脚本的几种实现方式对比Java调用Python脚本的几种实现方式对比Java调用Python脚本的几种实现方式对比

    java调用python脚本有三种主要方式:进程调用、jython嵌入和rpc/消息队列;2. 进程调用通过runtime.exec或processbuilder启动独立python进程,适用于简单脚本但性能开销大;3. jython嵌入将python代码编译为java字节码,实现无缝集成但不支持c…

    2026年10月6日 • 用户投稿
    200
  • PostgreSQL时间戳时区偏移量超出范围错误解析与修正

    PostgreSQL时间戳时区偏移量超出范围错误解析与修正PostgreSQL时间戳时区偏移量超出范围错误解析与修正PostgreSQL时间戳时区偏移量超出范围错误解析与修正PostgreSQL时间戳时区偏移量超出范围错误解析与修正

    本文深入解析了PostgreSQL中“time zone displacement out of range”错误,该错误通常发生在使用timestamp with time zone类型时,由于对时间戳字符串中时区偏移部分的误解导致。文章详细阐述了+HH或+HHMM表示的是时区偏移而非毫秒,并指出…

    2026年10月6日 • 用户投稿
    200
  • 解决PostgreSQL时间戳时区偏移超出范围错误

    解决PostgreSQL时间戳时区偏移超出范围错误解决PostgreSQL时间戳时区偏移超出范围错误解决PostgreSQL时间戳时区偏移超出范围错误解决PostgreSQL时间戳时区偏移超出范围错误

    本文旨在解决PostgreSQL数据库中time zone displacement out of range错误,该错误通常源于时间戳字符串中时区偏移部分的误解和不当格式化。我们将深入分析错误产生的原因,特别是结合Python代码生成时间戳字符串时的常见陷阱,并提供正确的处理策略和最佳实践,确保时…

    2026年10月6日 • 用户投稿
    300
  • VSCode如何实现代码行为分析 VSCode运行时特性可视化工具

    VSCode如何实现代码行为分析 VSCode运行时特性可视化工具VSCode如何实现代码行为分析 VSCode运行时特性可视化工具VSCode如何实现代码行为分析 VSCode运行时特性可视化工具VSCode如何实现代码行为分析 VSCode运行时特性可视化工具

    高效调试与性能瓶颈定位需结合断点调试、条件断点、日志断点及内置调试器功能,通过launch.json配置调试环境,利用cpu性能分析和堆快照定位问题;2. 可视化运行时数据依赖第三方扩展,如调试器增强类、性能分析查看器、内存/cpu监控、日志可视化工具和调用图生成器,按语言和项目选择合适扩展;3. …

    2026年10月6日 • 用户投稿
    100
  • Java游戏开发 Java 2D游戏引擎入门教程

    Java游戏开发 Java 2D游戏引擎入门教程Java游戏开发 Java 2D游戏引擎入门教程Java游戏开发 Java 2D游戏引擎入门教程Java游戏开发 Java 2D游戏引擎入门教程

    在java中开发2d游戏的核心在于理解游戏循环、绘图、输入处理和碰撞检测等基本要素,并通过awt/swing从零构建框架以深入理解本质。解决方案分五步:1. 游戏循环使用独立线程持续更新游戏状态并重绘屏幕;2. 用jpanel的paintcomponent方法结合graphics2d进行绘图;3. …

    2026年10月6日 • 用户投稿
    100
  • 使用 Firestore Query Protos 自动生成多语言查询方法

    使用 Firestore Query Protos 自动生成多语言查询方法使用 Firestore Query Protos 自动生成多语言查询方法使用 Firestore Query Protos 自动生成多语言查询方法使用 Firestore Query Protos 自动生成多语言查询方法

    本文旨在帮助开发者将 Firestore 查询从一种编程语言转换为另一种,尤其是当需要在多种语言之间共享查询逻辑时。核心思想是将 Firestore 查询转换为 Protobuf 格式,然后利用字符串格式化技术,根据 Protobuf 字符串生成目标语言的查询代码。 1. 将 Firestore 查…

    2026年10月6日 • 用户投稿
    200
  • 从 Firestore Query Protos 自动生成多语言查询方法

    从 Firestore Query Protos 自动生成多语言查询方法从 Firestore Query Protos 自动生成多语言查询方法从 Firestore Query Protos 自动生成多语言查询方法从 Firestore Query Protos 自动生成多语言查询方法

    本文将介绍一种利用 firestore 的 structuredquery 类,结合字符串格式化技术,实现从 java firestore 查询自动生成其他编程语言查询代码的方法。这种方法允许开发者在不同编程语言之间复用 firestore 查询逻辑,从而简化多语言应用的开发。 在 Java 中,可…

    2026年10月6日 • 用户投稿
    100
  • 专属Python开发者的完美终端工具

    专属Python开发者的完美终端工具专属Python开发者的完美终端工具专属Python开发者的完美终端工具专属Python开发者的完美终端工具

    大家好,我是小编。 今天我为大家推荐一款非常精致的终端工具 – Rich。 Rich 是一个 Python 库,可以在终端中为您提供富文本和美观、精致的格式。 通过 Rich API,您可以轻松地在终端输出中添加各种颜色和不同的样式。它能绘制精美的表格、进度条、Markdown、语法高亮…

    2026年10月6日 • 用户投稿
    700
  • Cursor永久免费攻略:无限邮箱注册+重置机器码+Cursor试用期重置工具实现永久免费使用

    Cursor永久免费攻略:无限邮箱注册+重置机器码+Cursor试用期重置工具实现永久免费使用Cursor永久免费攻略:无限邮箱注册+重置机器码+Cursor试用期重置工具实现永久免费使用Cursor永久免费攻略:无限邮箱注册+重置机器码+Cursor试用期重置工具实现永久免费使用Cursor永久免费攻略:无限邮箱注册+重置机器码+Cursor试用期重置工具实现永久免费使用

    全新攻略:cursor pro 无限续杯技巧,全自动化工具,兼容cursor 0.46 此前苏米分享过几篇关于Cursor的教程文章,如今眼看Cursor的免费额度即将耗尽,升级至PRO需花费20美元/月,这对初学者而言成本偏高,那么普通用户该如何持续使用呢?苏米整理了目前较为可靠的四种方案,供正在…

    2026年10月5日 • 用户投稿
    200
  • VSCode如何通过AI生成技术文档 VSCode自动创建项目文档的AI工具

    安装并登录github copilot扩展,确保服务已激活;2. 利用copilot在函数、类、模块上方输入文档注释符号,ai将根据上下文自动生成函数作用、参数说明、返回值等内容;3. 在readme或配置文件中输入内容时,copilot会基于项目结构和文件信息提供建议;4. 将ai生成内容视为初稿…

    2026年10月5日
    200
  • PyCharm字体设置指南

    PyCharm字体设置指南PyCharm字体设置指南PyCharm字体设置指南PyCharm字体设置指南

    设置pycharm字体需打开编辑器设置,挑选合适的字体样式与大小,同时关注显示效果与兼容性问题。 1、 PyCharm社区版在大多数开发场景下功能完备,与专业版相比日常编码基本无差别。 2、 点击顶部菜单栏的“文件”,进入“设置”界面,随后选择“编辑器”进行相关配置。 3、 在右侧区域找到并点击“字…

    2026年10月5日 • 用户投稿
    1100
  • Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言

    Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言

    java 调用 python 脚本最常见方式是通过 processbuilder 执行外部命令,1. 可调用系统命令并传递参数,2. 支持设置环境变量与工作目录,3. 可捕获输出与错误信息,4. 需读取输入输出流避免阻塞,5. 通过 exitcode 判断执行结果,适用于 python 作为独立模块…

    2026年10月5日 • 用户投稿
    100
  • TIOBE 9 月榜单:Perl 重回前十

    TIOBE 9 月榜单:Perl 重回前十TIOBE 9 月榜单:Perl 重回前十TIOBE 9 月榜单:Perl 重回前十TIOBE 9 月榜单:Perl 重回前十

    2025年9月,TIOBE正式发布了最新一期的编程语言排行榜。本月最引人注目的变化是Perl强势回归前十,从一年前的第27位跃升至第10名。这一现象引发了广泛关注,TIOBE CEO Paul Jansen对此表示,尽管Perl曾在2005年3月达到历史巅峰(第3位),但此次复苏依然出人意料,值得深…

    2026年10月5日 • 用户投稿
    200
  • 深入理解Java方法返回类型与类型转换机制

    深入理解Java方法返回类型与类型转换机制深入理解Java方法返回类型与类型转换机制深入理解Java方法返回类型与类型转换机制深入理解Java方法返回类型与类型转换机制

    本文旨在探讨Java中方法返回类型与类型转换的机制,并明确指出无法通过对单一方法进行类型转换来使其返回不同数据类型值的行为。我们将深入分析Java的强类型特性、方法签名规则以及类型转换的本质,并提供常见的替代方案,以帮助开发者设计出更符合Java语言规范且类型安全的代码。 Java方法返回类型与类型…

    2026年10月5日 • 用户投稿
    200
  • 豆包人工智能在线入口 豆包人工智能网页版在线入口

    豆包人工智能在线入口 豆包人工智能网页版在线入口豆包人工智能在线入口 豆包人工智能网页版在线入口豆包人工智能在线入口 豆包人工智能网页版在线入口豆包人工智能在线入口 豆包人工智能网页版在线入口

    豆包的使用方法包括打开官方网页、注册登录、开始对话和获取答案。1. 打开网页:点击提供的链接进入豆包官网;2. 注册/登录:新用户注册或已有用户登录;3. 开始对话:在输入框提出问题或需求,如总结新闻、写文章或翻译;4. 获取答案:根据豆包的回复进一步提问或修改内容。豆包适用于信息查询、内容创作、学…

    2026年10月5日 • 用户投稿
    100
  • 为 jupyterlab 添加 debugger 扩展

    如何安装并使用 anaconda、jupyterlab、node.js 和 xpython 进行调试?以下是详细的步骤指南。 基本流程 安装 Anaconda安装 JupyterLab安装 Node.js安装 XPython建立 JupyterLab 工程搜索并安装插件使用插件进行调试 具体步骤 安…

    2026年10月5日
    200
  • Ubuntu 25.10 将默认搭载 Linux 6.17 内核

    Ubuntu 25.10 将默认搭载 Linux 6.17 内核Ubuntu 25.10 将默认搭载 Linux 6.17 内核Ubuntu 25.10 将默认搭载 Linux 6.17 内核Ubuntu 25.10 将默认搭载 Linux 6.17 内核

    Canonical 内核团队已将 Linux 6.17 的快照版本纳入 Ubuntu 25.10(Questing Quokka)的默认内核行列。目前该内核已集成至最新的每日构建版(daily ISOs),用户在安装 Ubuntu 25.10 时将自动搭载 Linux 6.17。 预计 Linux …

    2026年10月5日 • 用户投稿
    200
  • VSCode如何集成机器人开发工具链 VSCodeROS项目开发的配置指南

    zuojiankuohaophpc++nol> vscode中ros开发的核心扩展有:ros扩展、c/c++扩展、python扩展、cmake tools扩展、remote – ssh和dev containers扩展;2. 配置vscode正确识别ros环境和c++头文件的方法是…

    2026年10月4日
    100

发表回复

登录后才能评论
关注微信