教你Node.js+SpreadJS从服务端生成Excel电子表格

教你Node.js+SpreadJS从服务端生成Excel电子表格

Node是一个基于Chrome V8引擎的JavaScript运行环境,通常用于创建网络应用程序。它可以同时处理多个连接,并且不像其他大多数模型那样依赖线程。

对于 Web 开发者来说,从数据库或Web服务器获取数据,然后输出到Excel文件以进行进一步分析的场景时有发生。我们的技术团队在跟国内外各行各业用户交流的过程中,就曾发现有很多的用户尝试在Node.js的环境下运行SpreadJS 纯前端表格控件,借助该控件,可以在服务器不预装任何Excel依赖项的情况下,收集用户输入的信息,并将其自动导出到Excel文件中。

为了满足广大技术爱好者的需要,同时减少大家在未来技术选型方面所走的弯路,本文将就SpreadJS 与 Node.js之间的技术性方案进行探讨!

一、安装 SpreadJS 和 Node .js

首先,我们需要安装Node.js以及Mock-Browser,BufferJS和FileReader,大家可以前往以下链接进行下载,同步操作:

Installing Node.js viaPackage ManagerMock-BrowserBufferJSFileReader

我们将使用Visual Studio创建应用程序。打开Visual Studio后,使用JavaScript> Node.js>Blank Node.js控制台应用程序模板创建一个新应用程序。这将自动创建所需的文件并打开” app.js”文件,也是我们将要更改的唯一文件。

对于BufferJS库,您需要下载该软件包,然后通过导航到项目文件夹(一旦创建)并运行以下命令,将其手动安装到项目中:

npm install

安装完成后,您可能需要打开项目的package.json文件并将其添加到” dependencies”部分。文件内容应如下所示:

{"name": "spread-sheets-node-jsapp","version": "0.0.0","description": "SpreadSheetsNodeJSApp","main": "app.js","author": {   "name": "admin"},"dependencies": {   "FileReader": "^0.10.2",   "bufferjs": "1.0.0",   "mock-browser": "^0.92.14"  }}

在此示例中,我们将使用Node.js的文件系统模块。我们可以将其加载到:

var fs = require('fs')

为了将SpreadJS与Node.js结合使用,我们还需要加载已安装的Mock-Browser:

var mockBrowser =require('mock-browser').mocks.MockBrowser

在加载SpreadJS脚本之前,我们需要初始化模拟浏览器。初始化我们稍后在应用程序中可能需要使用的变量,尤其是” window”变量:

global.window =mockBrowser.createWindow()global.document = window.documentglobal.navigator = window.navigatorglobal.HTMLCollection =window.HTMLCollectionglobal.getComputedStyle =window.getComputedStyle

初始化FileReader库:

var fileReader = require('filereader');global.FileReader = fileReader;

二、使用SpreadJS npm 包

将SpreadJS安装文件中的SpreadJS Sheets和ExcelIO包添加到项目中。

您可以通过右键单击解决方案资源管理器的” npm”部分并将它们添加到您的项目中,然后选择”安装新的NPM软件包”。您应该能够搜索” GrapeCity”并安装以下2个软件包:

@grapecity/spread-sheets@grapectiy/spread-excelio

将SpreadJS npm软件包添加到项目后,正确的依赖关系将被写入package.json:

{"name": "spread-sheets-node-jsapp","version": "0.0.0","description": "SpreadSheetsNodeJSApp","main": "app.js","author": {   "name": "admin"},  "dependencies":{   "@grapecity/spread-excelio": "^11.2.1",   "@grapecity/spread-sheets": "^11.2.1",   "FileReader": "^0.10.2",   "bufferjs": "1.0.0",   "mock-browser": "^0.92.14"  }}

现在我们需要在app.js文件中引入它:

var GC =require('@grapecity/spread-sheets')var GCExcel =require('@grapecity/spread-excelio');

使用npm软件包时,还需要设置许可证密钥(点击此处,免费申请许可证密钥):

酷表ChatExcel 酷表ChatExcel

北大团队开发的通过聊天来操作Excel表格的AI工具

酷表ChatExcel 48 查看详情 酷表ChatExcel

GC.Spread.Sheets.LicenseKey =""

在这个特定的应用程序中,我们将向用户显示他们正在使用哪个版本的SpreadJS。为此,我们可以引入package.json文件,然后引用依赖项以获取版本号:

var packageJson =require('./package.json')console.log('n** Using Spreadjs Version"' + packageJson.dependencies["@grapecity/spread-sheets"] +'" **')

三、将 Excel 文件加载到您的 Node.js 应用程序中

点击此处,下载现成的Excel模板文件,该文件包含了从用户那里获取数据。接下来,将数据放入文件中并导出。在这种情况下,文件是用户可以编辑的状态。

初始化工作簿和ExcelIO变量:

var wb = new GC.Spread.Sheets.Workbook();var excelIO = new GCExcel.IO();

我们在读取文件时将代码包装在try / catch块中。然后,初始化变量” readline”,让您读取用户输入到控制台的数据。接下来,我们将其存储到一个JavaScript数组中,以便轻松填写Excel文件:

// Instantiate the spreadsheet and modifyitconsole.log('nManipulatingSpreadsheetn---');try {   var file = fs.readFileSync('./content/billingInvoiceTemplate.xlsx');   excelIO.open(file.buffer, (data) => {       wb.fromJSON(data);       const readline = require('readline');       var invoice = {            generalInfo: [],            invoiceItems: [],            companyDetails: []       };   });} catch (e) {   console.error("** Error manipulating spreadsheet **");   console.error(e);}

四、收集用户输入信息

教你Node.js+SpreadJS从服务端生成Excel电子表格

上图显示了我们正在使用的Excel文件。我们可以在excelio.open调用中创建一个单独的函数,以在控制台中提示用户需要的每一项内容。我们也可以创建一个单独的数组,将数据保存到每个输入后,然后将其推送到我们创建的invoice.generalInfo数组中:

fillGeneralInformation();function fillGeneralInformation() {   console.log("-----------------------nFill in InvoiceDetailsn-----------------------")   const rl = readline.createInterface({       input: process.stdin,       output: process.stdout   });   var generalInfoArray = [];   rl.question('Invoice Number: ', (answer) => {       generalInfoArray.push(answer);       rl.question('Invoice Date (dd Month Year): ', (answer) => {           generalInfoArray.push(answer);            rl.question('Payment Due Date (ddMonth Year): ', (answer) => {                generalInfoArray.push(answer);                rl.question('Customer Name: ',(answer) => {                   generalInfoArray.push(answer);                    rl.question('CustomerCompany Name: ', (answer) => {                       generalInfoArray.push(answer);                        rl.question('Customer Street Address:', (answer) => {                           generalInfoArray.push(answer);                           rl.question('Customer City, State, Zip (, ): ', (answer) => {                                generalInfoArray.push(answer);                               rl.question('Invoice Company Name: ', (answer) => {                                   generalInfoArray.push(answer);                                   rl.question('Invoice Street Address: ', (answer) => {                                       generalInfoArray.push(answer);                                       rl.question('Invoice City, State, Zip (, ): ', (answer) => {                                            generalInfoArray.push(answer);                                           rl.close();                                           invoice.generalInfo.push({                                               "invoiceNumber": generalInfoArray[0],                                               "invoiceDate": generalInfoArray[1],                                               "paymentDueDate": generalInfoArray[2],                                               "customerName": generalInfoArray[3],                                               "customerCompanyName": generalInfoArray[4],                                               "customerStreetAddress": generalInfoArray[5],                                               "customerCityStateZip": generalInfoArray[6],                                               "invoiceCompanyName": generalInfoArray[7],                                               "invoiceStreetAddress": generalInfoArray[8],                                               "invoiceCityStateZip": generalInfoArray[9],                                            });                                           console.log("General Invoice Information Stored");                                           fillCompanyDetails();                                        });                                    });                               });                            });                        });                    });                });            });       });   });}

该函数被称为” fillCompanyDetails”,目的是收集有关公司的信息以填充到工作簿的第二张表中:

function fillCompanyDetails() {   console.log("-----------------------nFill in CompanyDetailsn-----------------------")   const rl = readline.createInterface({       input: process.stdin,       output: process.stdout   });   var companyDetailsArray = []   rl.question('Your Name: ', (answer) => {       companyDetailsArray.push(answer);       rl.question('Company Name: ', (answer) => {            companyDetailsArray.push(answer);            rl.question('Address Line 1: ',(answer) => {               companyDetailsArray.push(answer);                rl.question('Address Line 2: ',(answer) => {                   companyDetailsArray.push(answer);                    rl.question('Address Line3: ', (answer) => {                       companyDetailsArray.push(answer);                        rl.question('AddressLine 4: ', (answer) => {                           companyDetailsArray.push(answer);                           rl.question('Address Line 5: ', (answer) => {                               companyDetailsArray.push(answer);                               rl.question('Phone: ', (answer) => {                                   companyDetailsArray.push(answer);                                   rl.question('Facsimile: ', (answer) => {                                       companyDetailsArray.push(answer);                                        rl.question('Website: ', (answer)=> {                                           companyDetailsArray.push(answer);                                           rl.question('Email: ', (answer) => {                                                companyDetailsArray.push(answer);                                               rl.question('Currency Abbreviation: ', (answer) => {                                                   companyDetailsArray.push(answer);                                                    rl.question('Beneficiary: ',(answer) => {                                                       companyDetailsArray.push(answer);                                                       rl.question('Bank: ', (answer) => {                                                            companyDetailsArray.push(answer);                                                           rl.question('Bank Address: ', (answer) => {                                                               companyDetailsArray.push(answer);                                                               rl.question('Account Number: ', (answer) => {                                                                   companyDetailsArray.push(answer);                                                                    rl.question('RoutingNumber: ', (answer) => {                                                                       companyDetailsArray.push(answer);                                                                       rl.question('Make Checks Payable To: ', (answer) => {                                                                           companyDetailsArray.push(answer);                                                                            rl.close();                                                                           invoice.companyDetails.push({                                                                               "yourName": companyDetailsArray[0],                                                                               "companyName": companyDetailsArray[1],                                                                               "addressLine1": companyDetailsArray[2],                                                                               "addressLine2": companyDetailsArray[3],                                                                               "addressLine3": companyDetailsArray[4],                                                                               "addressLine4": companyDetailsArray[5],                                                                               "addressLine5": companyDetailsArray[6],                                                                                "phone":companyDetailsArray[7],                                                                               "facsimile": companyDetailsArray[8],                                                                                "website":companyDetailsArray[9],                                                                               "email": companyDetailsArray[10],                                                                               "currencyAbbreviation":companyDetailsArray[11],                                                                               "beneficiary": companyDetailsArray[12],                                                                               "bank":companyDetailsArray[13],                                                                               "bankAddress": companyDetailsArray[14],                                                                               "accountNumber": companyDetailsArray[15],                                                                               "routingNumber": companyDetailsArray[16],                                                                               "payableTo": companyDetailsArray[17]                                                                           });                                                                           console.log("Invoice Company Information Stored");                                                                            console.log("-----------------------nFillin Invoice Itemsn-----------------------")                                                                           fillInvoiceItemsInformation();                                                                        });                                                                   });                                                               });                                                           });                                                       });                                                   });                                               });                                            });                                        });                                    });                                });                            });                        });                    });                });            });       });   });}

教你Node.js+SpreadJS从服务端生成Excel电子表格

现在我们已经有了用户的基本信息,我们可以集中精力收集单个项目,并另命名为” fillInvoiceItemsInformation”函数。在每个项目执行之前,我们会询问用户是否要添加一个项目。如果他们继续输入” y”,那么我们将收集该项目的信息,然后再次询问直到他们键入” n”:

function fillInvoiceItemsInformation() {   const rl = readline.createInterface({       input: process.stdin,       output: process.stdout   });   var invoiceItemArray = [];   rl.question('Add item?(y/n): ', (answer) => {       switch (answer) {            case "y":               console.log("-----------------------nEnter ItemInformationn-----------------------");                rl.question('Quantity: ',(answer) => {                   invoiceItemArray.push(answer);                    rl.question('Details: ',(answer) => {                       invoiceItemArray.push(answer);                        rl.question('UnitPrice: ', (answer) => {                           invoiceItemArray.push(answer);                           invoice.invoiceItems.push({                               "quantity":invoiceItemArray[0],                               "details": invoiceItemArray[1],                               "unitPrice": invoiceItemArray[2]                            });                            console.log("ItemInformation Added");                            rl.close();                           fillInvoiceItemsInformation();                        });                    });                });                break;            case "n":               rl.close();                return fillExcelFile();                break;            default:                console.log("Incorrectoption, Please enter 'y' or 'n'.");       }   });}

五、填入您的Excel 文件

在收集所有必需的用户信息后,我们可以将其填入到Excel文件中:

function fillExcelFile() {   console.log("-----------------------nFilling in Excelfilen-----------------------");   fillBillingInfo();   fillCompanySetup();}function fillBillingInfo() {   var sheet = wb.getSheet(0);   sheet.getCell(0, 2).value(invoice.generalInfo[0].invoiceNumber);   sheet.getCell(1, 1).value(invoice.generalInfo[0].invoiceDate);   sheet.getCell(2, 2).value(invoice.generalInfo[0].paymentDueDate);   sheet.getCell(3, 1).value(invoice.generalInfo[0].customerName);   sheet.getCell(4, 1).value(invoice.generalInfo[0].customerCompanyName);   sheet.getCell(5, 1).value(invoice.generalInfo[0].customerStreetAddress);   sheet.getCell(6, 1).value(invoice.generalInfo[0].customerCityStateZip);   sheet.getCell(3, 3).value(invoice.generalInfo[0].invoiceCompanyName);   sheet.getCell(4, 3).value(invoice.generalInfo[0].invoiceStreetAddress);   sheet.getCell(5, 3).value(invoice.generalInfo[0].invoiceCityStateZip);}function fillCompanySetup() {   var sheet = wb.getSheet(1);   sheet.getCell(2, 2).value(invoice.companyDetails[0].yourName);   sheet.getCell(3, 2).value(invoice.companyDetails[0].companyName);   sheet.getCell(4, 2).value(invoice.companyDetails[0].addressLine1);   sheet.getCell(5, 2).value(invoice.companyDetails[0].addressLine2);   sheet.getCell(6, 2).value(invoice.companyDetails[0].addressLine3);   sheet.getCell(7, 2).value(invoice.companyDetails[0].addressLine4);   sheet.getCell(8, 2).value(invoice.companyDetails[0].addressLine5);   sheet.getCell(9, 2).value(invoice.companyDetails[0].phone);   sheet.getCell(10, 2).value(invoice.companyDetails[0].facsimile);   sheet.getCell(11, 2).value(invoice.companyDetails[0].website);   sheet.getCell(12, 2).value(invoice.companyDetails[0].email);   sheet.getCell(13, 2).value(invoice.companyDetails[0].currencyAbbreviation);   sheet.getCell(14, 2).value(invoice.companyDetails[0].beneficiary);   sheet.getCell(15, 2).value(invoice.companyDetails[0].bank);   sheet.getCell(16, 2).value(invoice.companyDetails[0].bankAddress);   sheet.getCell(17, 2).value(invoice.companyDetails[0].accountNumber);   sheet.getCell(18, 2).value(invoice.companyDetails[0].routingNumber);   sheet.getCell(19, 2).value(invoice.companyDetails[0].payableTo);}

为了防止用户添加的数量超过工作表最大行数,我们可以在工作表中自动添加更多行。在设置数组中表单中的项目之前,默认添加行:

function fillInvoiceItems() {   var sheet = wb.getSheet(0);   var rowsToAdd = 0;   if (invoice.invoiceItems.length > 15) {       rowsToAdd = invoice.invoiceItems.length - 15;       sheet.addRows(22, rowsToAdd);   }   var rowIndex = 8;   if (invoice.invoiceItems.length >= 1) {       for (var i = 0; i < invoice.invoiceItems.length; i++) {            sheet.getCell(rowIndex,1).value(invoice.invoiceItems.quantity);            sheet.getCell(rowIndex,2).value(invoice.invoiceItems.details);            sheet.getCell(rowIndex,3).value(invoice.invoiceItems.unitPrice);            rowIndex++;       }   }}

六、将文档内容从 Node.js 导出到 Excel 文件

在工作簿中填写完信息后,我们可以将工作簿导出到Excel文件中。为此,我们将使用excelio打开功能。在这种情况下,只需将日期输入文件名即可:

function exportExcelFile() {   excelIO.save(wb.toJSON(), (data) => {       fs.appendFileSync('Invoice' + new Date().valueOf() + '.xlsx', newBuffer(data), function (err) {            console.log(err);       });       console.log("Export success");   }, (err) => {       console.log(err);   }, { useArrayBuffer: true });}

完成的文件将如下所示:

教你Node.js+SpreadJS从服务端生成Excel电子表格

更多node相关知识,请访问:nodejs 教程!

以上就是教你Node.js+SpreadJS从服务端生成Excel电子表格的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
为什么iPhone4S系统升级后屏幕失灵如何强制重启?长按电源键和主页键重启
上一篇 2025年11月9日 17:30:48
大羊驼、羊驼、小羊驼和ChatGPT比差在哪儿?七个类ChatGPT大模型测评
下一篇 2025年11月9日 17:30:51

相关推荐

  • JavaScript 高效判断页面所有复选框状态的技巧与实践

    本文旨在提供一套高效且专业的javascript方法,用于判断网页中所有复选框的选中状态。我们将探讨如何利用`array.some()`快速确定是否有未选中的复选框(进而判断是否全部选中),以及如何使用`array.filter()`统计选中和未选中的复选框数量。通过优化dom元素选择和数组操作,提…

    2026年5月10日
    000
  • OSMnx中interpolate_points函数详解及街道细分与图构建实践

    本文详细介绍了osmnx库中`utils_geo.interpolate_points`函数的使用方法,特别是其返回的python生成器类型。我们将学习如何处理生成器输出,并提供一个完整的教程,演示如何利用此函数将现有街道几何体细分为更小的线段,进而构建一个精细化的网络图,以支持更细粒度的空间分析。…

    2026年5月10日
    000
  • 如何安全有效地从外部网页获取HTML元素数据并应用于自身页面

    本教程旨在解决如何在不同域名下,通过javascript获取并使用另一个网页的html元素数据。文章将深入探讨同源策略的限制,并提供两种主要解决方案:使用` 在现代Web开发中,有时我们需要从外部网站获取特定的HTML内容或属性值,并将其整合到我们自己的网页中。例如,从XYZ.COM/B.html页…

    2026年5月10日
    000
  • JS如何操作HTML元素_DOM编程核心方法【教程】

    必须掌握操作HTML元素的核心DOM方法:一、通过ID获取单个元素;二、通过类名获取元素集合;三、通过标签名获取元素集合;四、通过CSS选择器获取元素;五、为元素绑定事件监听器;六、创建并插入新元素;七、替换或删除现有元素。 如果您希望使用JavaScript动态修改网页内容、响应用户交互或构建交互…

    2026年5月10日
    000
  • Golang如何提升TCP长连接处理效率_Golang TCP长连接处理性能优化实践详解

    答案:通过非阻塞I/O、单Goroutine双工模型、sync.Pool对象复用、TCP_NODELAY优化及高效心跳管理,结合系统调优,可显著提升Golang百万级TCP长连接处理效率。 在高并发网络服务场景中,TCP长连接的处理效率直接影响系统的吞吐能力和资源消耗。Golang凭借其轻量级Gor…

    2026年5月10日
    000
  • 怎么安装html5_HTML5开发环境安装与配置详细步骤

    答案是配置HTML5开发环境需三步:1. 安装VS Code等编辑器并配置插件;2. 使用Chrome或Firefox测试页面;3. 可选搭建本地服务器,如Live Server或http-server;最后创建index.html文件验证环境。 安装HTML5开发环境其实并不复杂,因为HTML5本…

    2026年5月10日
    000
  • 使用SMTP.js发送邮件:客户端集成、常见问题与最佳实践指南

    本文深入探讨了使用SMTP.js库在前端发送邮件时可能遇到的问题,特别是与Elastic Email集成时的挑战。我们将分析代码中常见的异步处理错误、条件函数定义陷阱,并提供修正后的代码示例和最佳实践。重点强调了正确处理Promise链、确保函数可访问性以及客户端邮件发送的安全考量,帮助开发者构建更…

    2026年5月10日
    000
  • 如何在不暴露密钥的情况下,在客户端创建 Stripe Payment Link

    本文介绍了在纯静态网站环境下,如何利用 Stripe Payment Link 实现商品售卖,并着重讨论了在不暴露 Stripe 密钥的前提下,客户端创建 Payment Link 的可行性。分析了直接在客户端使用密钥的风险,并提出了预先生成 Payment Link 或使用后端服务动态生成 Pay…

    2026年5月10日
    000
  • Windows用Prettier一键格式化乱码HTML代码

    首先确保HTML文件保存为UTF-8编码,使用文本编辑器另存为UTF-8格式;其次在命令行执行chcp 65001切换至UTF-8代码页后再运行Prettier;接着在VS Code中设置files.encoding为utf8并启用files.autoGuessEncoding;最后可通过Node.…

    2026年5月10日
    000
  • php怎么截取网页_php抓取网页内容的几种方法

    file_get_contents适用于静态页抓取,但受限于allow_url_fopen且无法执行JS;2. cURL支持自定义请求头、Cookie等,适合处理复杂HTTP请求;3. Guzzle作为现代PHP项目推荐方案,具备良好扩展性与异步支持;4. 动态渲染内容需借助Puppeteer或Se…

    2026年5月10日
    000
  • html函数如何实现动态内容显示 html函数在网页交互中的核心应用

    JavaScript函数通过操作DOM实现动态内容更新与交互,如显示时间、实时搜索、增删元素及加载数据,使网页具备动态功能。 HTML 本身没有“函数”的概念,它是一种标记语言,用于定义网页结构。真正实现动态内容显示和交互功能的是 JavaScript。通常所说的“HTML函数”其实是 JavaSc…

    2026年5月10日
    000
  • HTMLAMP怎么做_加速移动页面实现教程

    答案:HTML AMP通过规范标签、禁用自定义JS、引入AMP JS库和缓存技术提升移动页面加载速度,需遵循AMP HTML标准并验证有效性,有助于SEO但非万能,未来将更开放并与PWA等融合。 HTML AMP 旨在加速移动页面加载速度,提升用户体验。简单来说,它通过限制某些 HTML 功能,并采…

    2026年5月10日
    000
  • 理解PHP服务器端请求与浏览器开发者工具的限制

    当PHP脚本使用file_get_contents等函数发起服务器端请求时,这些请求直接在服务器上执行,而非通过浏览器。因此,浏览器开发者工具的网络活动面板无法捕获和显示这些内部的服务器间通信,因为它仅监控浏览器自身发出的网络请求,对服务器内部处理过程无感知。 客户端请求与服务器端请求的本质区别 在…

    2026年5月10日
    000
  • JavaScript DOM操作:点击关联元素获取目标文本内容的教程

    本教程详细介绍了如何通过JavaScript处理用户点击事件,并结合DOM的 closest() 和 querySelector() 方法,从复杂的HTML结构中准确获取目标元素的文本内容。文章强调了使用 addEventListener() 进行事件绑定、避免重复ID以及高效DOM遍历的最佳实践,…

    2026年5月10日
    000
  • 前端构建优化:利用常量折叠提升应用性能

    本文深入探讨了一种在构建阶段执行部分源代码以进行优化的技术——常量折叠(Constant Folding)。通过在编译时预计算表达式并替换为最终结果,该技术显著减少了运行时开销,提升了应用性能。文章将详细解释其工作原理、优势,并探讨其在现代前端构建工具中的应用与配置,旨在帮助开发者实现更高效的代码优…

    2026年5月10日
    000
  • JavaScript数据结构实现_javascript算法基础

    JavaScript中常用数据结构包括栈、链表和字典:1. 栈利用数组的push和pop实现LIFO,适用于括号匹配;2. 链表由节点组成,插入删除高效,适合频繁修改场景;3. 字典用对象实现键值对存储,常用于频率统计;4. 二分查找在有序数组中以O(log n)效率查找目标值,需数组已排序。掌握这…

    2026年5月10日
    000
  • JavaScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程

    本教程详细介绍了如何使用javascript实现井字棋(tic-tac-toe)游戏的核心交互逻辑。内容涵盖了如何遍历并为棋盘上的每个方格添加点击事件监听器,实现玩家x和o的交替落子,以及重置游戏状态的功能。通过提供的html、css和javascript代码示例,读者可以快速理解并构建一个基础的井…

    2026年5月10日
    000
  • 全栈JS代码怎么结构化_全栈JavaScript项目代码结构与规范指南

    采用分层+功能划分的目录结构,明确分离前后端代码;2. 遵循单一职责原则,路由、控制器、服务与模型各司其职;3. 统一命名规范并集成ESLint+Prettier保证代码风格一致;4. 使用环境变量管理配置,通过脚本实现自动化构建与并发启动服务。 全栈JavaScript项目涉及前端、后端、数据库交…

    2026年5月10日
    000
  • JavaScript模块加载机制_JavaScript代码组织规范

    现代前端推荐使用ES Modules,通过import和export实现静态依赖管理,配合合理目录结构与命名规范提升可维护性,注意浏览器与Node.js的运行差异。 JavaScript 的模块加载机制和代码组织规范是现代前端开发中的核心基础。随着项目规模扩大,良好的模块化设计能提升代码可维护性、复…

    2026年5月10日
    000
  • JavaScript模块化是什么_ES6模块和CommonJS有什么区别呢

    JavaScript模块化将代码拆分为独立可复用单元,ES6模块(import/export,编译时加载、实时引用)与CommonJS(require/module.exports,运行时加载、值拷贝)核心区别在于设计目标和运行机制不同。 JavaScript模块化是把代码按功能拆分成独立、可复用的…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信