前端-js开发

课堂完结后欲复习巩固也方便后续-重游-故写此篇
从实现功能过渡到涉及的相关知识点

知识点

1、 JS 是前端语言,是可以被浏览器“看到”的,当然也可以被修改啊,被浏览器禁用网页的 JS 功能啊之类的。所以一般都是前后端分离开发,前端只负责显示与提醒用户。

2、 JS 是可以在浏览器里调试的,断点之类的都行,浏览器里也有控制台可以执行命令。

3、 浏览器不可能看到所有的 JS 文件,但是断点也带来了其他可能,只要断在你想知道参数的地方,那么没有显示的 JS 文件也不行影响到你,毕竟你只需要它们运行而非一定得拿到源码。

登录验证

简单流程:(最初实验版)前端 js 发送用户名和密码给后端,后端判断是否正确后返回参数,js依据参数决定是否进行页面跳转与弹窗

分析问题:

1、 前端语言是可以看到的,是可以被改变的,所以不能给前端跳转页面的权力,只能做提醒,不然会导致安全问题。

前端语言应只供展示与简单提醒

Code:
前端 js 部分代码如下:

<!-- 采用js传输,php验证-->
<body><h3>用户登录</h3><div><label for="username">用户名:</label><input type="text" class="username" name="username" required></div><br><div><label for="password">密码:</label><input type="password" class="password" name="password" required></div><br><button>登录</button>
</body><!-- //导入jquery --><script src="./js/js/jquery-3.7.1.js"></script>
<!-- 都是键值对!!! -->
<script>$('button').click(function(){$.ajax({url: "check_login.php",data: {user:$('.username').val(),passwd:$('.password').val()},type: "POST",dataType: "json",success: function(data) {console.log(data);if(data.info==1){alert('登陆成功!');// location.href="index.php";/*** 安全漏洞出现,原因:前端代码不可进行操作,只需要提示就可以了* * 小写,哦~*/}else{console.log('登陆失败!');}},error: function(text) {alert('登陆失败!');}});});</script>

文件上传

简单流程:前端 js 判断文件格式等是否正确,然后发送给后端 php 进一步处理文件。
简单模拟了已下前端部分,并没有写后端 php。

分析问题:

1、 前端先做第一步判断减轻服务器压力,但是也容易被绕过,所以后端还是得判断一次(也许可以优化法子?)

2、 但是并没有赋予前端任何权利并没有安全问题,压力给到后端。

Code:
前端部分 js 代码如下:

<body><div class="upload-container"><h2>上传文件</h2><form action="upload.php" method="post" enctype="multipart/form-data"><input type="file" name="fileToUpload" id="file"  onchange="check_upload(this.value)"><button type="submit">上传文件</button></form></div>
</body><!-- 使用js来实现前端的文件格式过滤 -->
<script>//文件后缀白名单let list_write=['jpg','png','gif','jpeg','webp'];//文件上传时发生改变触发方法function check_upload(file_name){//取出后缀let idx=file_name.lastIndexOf('.');let val=file_name.substring(idx+1,file_name.length);if(list_write.indexOf(val)!=-1){console.log('文件格式无误');//将文件发送后端……}else{//刷新网页取消文件输入location.reload(true);alert('文件格式有误');    }}
</script>

打包器webpack

基本的目录结构如下:


D:\VSCODE\WEBPACK-DEMO
│ package.json(版本控制及脚本配置)
│ webpack.config.js(配置文件)

├─dist(打包后的成品code)
├─node_modules(依赖包)
└─src(存自己写的code)
   ├─index.html
   └─index.js

接下来通过简单使用来复习功能,并引入其作用。

开始之前先复习一下其概念:
Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。它分析项目结构,找到 JavaScript 模块以及其他一些浏览器不能直接运行的扩展语言(如 Scss,TypeScript 等),并将其转换和打包为合适的格式供浏览器使用。


然后使其使用与感悟:
就举个最简单的 js 方面的例子:一个html页面可能需要引入非常多的 js 文件,不但太多了不好维护,也会导致访问的速度变慢,为了解决这一问题,可以用打包器 webpack 将任意多个 js 文件打包成一个或几个 js 文件。流程大致如下:
1、打包器分析 js 文件之间的依赖关系(通过import/require语句)
2、构建依赖图
3、打包、优化、合并成一/几个 JS 文件

一、 新建文件夹 ‘js’,存放两个 js 文件
代码分别如下:

function divide(a,b){return a-b;
}
export default divide;
export default function add(a,b){return a+b;
}

二、 在 src 目录下新建一个 JS 文件用于联系多个 JS 文件(上面两)

import one from '../js/_1';
import two from '../js/_2';console.log(one(1,2))
console.log(two(1,2))

三、 配置 webpack.config.js 文件如下

const path = require('path');module.exports = {mode:"development",//开发模式// mode:"production" 生产模式entry: './src/index.js',//入口文件output: {filename: 'bundle.js',//结果文件path: path.resolve(__dirname, 'dist')//结果文件的位置},
}
知识点

1、 上面配置 code 中的 mode
    开发模式用于网站开发过程中,生产模式用于网站部署后。至于弄混会咋样,如图,源码漏泄给浏览器

在这里插入图片描述

四、 执行打包命令

首先在 package.json文件里添加下面代码,然后移动终端的路径到webpack根目录下,运行命令npm run build

  "scripts":{"build":"webpack"}

这里也贴上两种模式产生的结果 JS 文件代价量的区别

生产模式code:

(()=>{"use strict";console.log(1-2),console.log(3)})();

开发模式code:
是的,1行和100行的区别

/** ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").* This devtool is neither made for production nor for readable output files.* It uses "eval()" calls to create a separate source file in the browser devtools.* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)* or disable the default devtool with "devtool: false".* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).*/
/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ({/***/ "./js/_1.js":
/*!******************!*\!*** ./js/_1.js ***!\******************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction divide(a,b){\r\n    return a-b;\r\n}\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (divide);\n\n//# sourceURL=webpack:///./js/_1.js?\n}");/***/ }),/***/ "./js/_2.js":
/*!******************!*\!*** ./js/_2.js ***!\******************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ add)\n/* harmony export */ });\nfunction add(a,b){\r\n    return a+b;\r\n}\n\n//# sourceURL=webpack:///./js/_2.js?\n}");/***/ }),/***/ "./src/index.js":
/*!**********************!*\!*** ./src/index.js ***!\**********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _js_1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../js/_1 */ \"./js/_1.js\");\n/* harmony import */ var _js_2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../js/_2 */ \"./js/_2.js\");\n\r\n\r\n\r\nconsole.log((0,_js_1__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(1,2))\r\nconsole.log((0,_js_2__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(1,2))\n\n//# sourceURL=webpack:///./src/index.js?\n}");/***/ })/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			// no module.id needed
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
/******/ 	/* webpack/runtime/define property getters */
/******/ 	(() => {
/******/ 		// define getter functions for harmony exports
/******/ 		__webpack_require__.d = (exports, definition) => {
/******/ 			for(var key in definition) {
/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 				}
/******/ 			}
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
/******/ 	(() => {
/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/make namespace object */
/******/ 	(() => {
/******/ 		// define __esModule on exports
/******/ 		__webpack_require__.r = (exports) => {
/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 			}
/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
/******/ 		};
/******/ 	})();
/******/ 	
/************************************************************************/
/******/ 	
/******/ 	// startup
/******/ 	// Load entry module and return exports
/******/ 	// This entry module can't be inlined because the eval devtool is used.
/******/ 	var __webpack_exports__ = __webpack_require__("./src/index.js");
/******/ 	
/******/ })()
;

express实现服务端

服务器,也就是访问特定ip与端口会返回特定数据
由此
1、模拟网页刷新(渲染特定网页)
2、模拟网页传输用户名密码需要连接数据库并返回结果
3、依据get、post方式不同返回不同(路由)

由于是简单模拟,所以都集合在了一个server.js里,还有一个返回/渲染网页用的html文件。

html 文件为渲染用登录页面,code:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>登录页面</title><style>body {display: flex;justify-content: center;align-items: center;height: 100vh;font-family: sans-serif;}.login-form {padding: 20px;border: 1px solid #ccc;border-radius: 8px;width: 300px;}.error-message {color: red;display: none;}</style>
</head>
<body><form action="http://127.0.0.1:3001/login" method="POST" ><h3>用户登录</h3><div><label for="username">用户名:</label><input type="text" id="username" name="username" required></div><div><label for="password">密码:</label><input type="password" id="password" name="password" required></div><input type="submit" value="登录"></form>
</body>
</html>

server.js文件code:

// 引入模块
const express = require('express');
const bodyParser = require('body-parser');
const mysql = require('mysql');
// 创建一个express应用
const app = express();
// 定义端口号
const port = 3001;
// 提供静态文件服务
// app.use(express.static('public'));// 解析 application/x-www-form-urlencoded 数据
app.use(bodyParser.urlencoded({ extended: false }));// 初始页面
app.get('/',(req, res) => {// res.send('GET请求成功!');//还可以渲染(返回)html文件!!res.sendFile(__dirname+"/html/login.html");
});// 1、get 方式传输表单数据
app.get('/login',(req, res) => {//参数获取const u=req.query.username;const p=req.query.password;//连接数据库……//判断if(u=="admin" && p=="123456"){res.send("欢迎管理员!get");}else{res.send("闲杂人等不得入内!get");}
});
// 2、post 方式传输表单数据
app.post('/login',(req, res) => {//参数获取const u=req.body.username;const p=req.body.password;//数据库设置const connection = mysql.createConnection({host     : 'localhost',user     : 'root',password : 'password',database : 'user_all',port     :'3307'});//连接数据库connection.connect((error)=>{if(error){console.log("连接失败");}else{console.log("连接成功");}})//语句let sentence='SELECT * FROM admin where username="'+u+'" and password="'+p+'"';console.log(sentence);connection.query(sentence, (error, results, fields)=>{if(error){console.log("数据库连接失败")}console.log(results);try{//判断if(u==results[0]["username"] && p==results[0]["password"]){res.send("欢迎管理员!post");}else{res.send("闲杂人等不得入内!post");}}catch{console.log("语句有误!");}});// //判断// if(u=="admin" && p=="123456"){//     res.send("欢迎管理员!post");// }else{//     res.send("闲杂人等不得入内!post");// }
});// 启动服务器并监听指定端口
app.listen(port, () => {console.log(`Server is running on http://localhost:${port}`);
});

(如有不恰当的地方欢迎指正哦 ~o(●’◡’●)o)


参考blogs:

【webpack超详细教程,学webpack看这一篇就够了!(上)】

【【Webpack】三种模式详解】

【Webpack三种打包方式:(以下所有命令都是windows下执行的)】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92095.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92095.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92095.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript 概述

JavaScript 是一种高级、解释型编程语言&#xff0c;主要用于网页开发&#xff0c;使其具备动态交互功能。它是网页三大核心技术之一&#xff08;HTML、CSS、JavaScript&#xff09;&#xff0c;能够直接嵌入 HTML 页面并在浏览器中执行。核心特性动态弱类型语言 JavaScript 是…

Mermaid流程图可视化系统:基于Spring Boot与Node.js的三层架构实现

什么是Mermaid?系统架构设计 三层架构 overview架构交互流程 核心组件详解 1. Spring Boot后端2. Node.js中间层3. 前端界面 功能实现 1. 节点和关系管理2. 流程图渲染3. 主题切换4. 导出功能 使用指南 启动步骤页面操作 总结与展望 什么是Mermaid? Mermaid流程图可视化系统…

R 数据框:高效数据处理与分析的利器

R 数据框:高效数据处理与分析的利器 引言 在数据科学和统计分析领域,R语言因其强大的数据处理能力和丰富的统计模型而备受推崇。R数据框(data frame)是R语言中一种重要的数据结构,它以表格形式存储数据,使得数据的组织、操作和分析变得简单高效。本文将深入探讨R数据框…

论文阅读笔记:《Curriculum Coarse-to-Fine Selection for High-IPC Dataset Distillation》

论文阅读笔记&#xff1a;《Curriculum Coarse-to-Fine Selection for High-IPC Dataset Distillation》1.背景与动机2.核心贡献3.方法详解4.实验结果与贡献主体代码算法整体逻辑CVPR25 github 一句话总结&#xff1a; CCFS基于组合范式&#xff08;轨迹匹配选择真实图像&…

【Linux系统】详解,进程控制

前言&#xff1a; 上文我们讲到了Linux中的虚拟空间地址&#xff0c;知道了一个进程对应一个虚拟地址空间&#xff0c;虚拟空间地址与物理地址之间通过页表映射....【Linux】虚拟地址空间-CSDN博客 本文我们来讲一讲Linux系统是如何控制进程的&#xff01; 如果喜欢本期文章&am…

Matplotlib(五)- 绘制子图

文章目录一、子图概述1. 子图介绍2. 子图布局2.1 网格布局2.2 自由布局二、绘制等分区域子图1. 使用 plt.subplot() 绘制子图示例&#xff1a;绘制多个子图示例&#xff1a;工业月度同比情况2. 使用 plt.subplots() 绘制子图示例&#xff1a;绘制多个子图示例&#xff1a;部分国…

C++中互斥锁、共享锁深度解析

一&#xff0c;互斥锁互斥锁&#xff08;Mutex&#xff0c;全称 Mutual Exclusion&#xff09;是并发编程中用于保护共享资源的核心同步机制。它通过确保同一时间仅有一个线程访问临界区&#xff08;Critical Section&#xff09;&#xff0c;解决多线程环境下的数据竞争和不一…

Qt中的QWebSocket 和 QWebSocketServer详解:从协议说明到实际应用解析

前言 本篇围绕 QWebSocket 和 QWebSocketServer&#xff0c;从协议基础、通信模式、数据传输特点等方面展开&#xff0c;结合具体接口应用与实战案例进行说明。 在实时网络通信领域&#xff0c;WebSocket 技术以其独特的全双工通信能力&#xff0c;成为连接客户端与服务器的重要…

机器学习 —— 决策树

机器学习 —— 决策树&#xff08;Decision Tree&#xff09;详细介绍决策树是一种直观且易于解释的监督学习算法&#xff0c;广泛应用于分类和回归任务。它通过模拟人类决策过程&#xff0c;将复杂问题拆解为一系列简单的判断规则&#xff0c;最终形成类似 “树” 状的结构。以…

车规MCU软错误防护技术的多维度分析与优化路径

摘要&#xff1a;随着汽车电子技术的飞速发展&#xff0c;微控制单元&#xff08;MCU&#xff09;在汽车电子系统中的应用日益广泛。然而&#xff0c;大气中子诱发的单粒子效应&#xff08;SEE&#xff09;对MCU的可靠性构成了严重威胁。本文深入探讨了软错误防护技术在车规MCU…

原生微信小程序实现语音转文字搜索---同声传译

效果展示 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/23257ce3b6c149a1bb54fd8bc2a05c68.png#pic_center 注意&#xff1a;引入同声传译组件请看这篇文章 1.search.wxml <view class"search-page"><navigation-bar title"搜索" …

Wireshark安装过程缺失vc_runtimeMinimum_x64.msi文件,安装 Visual C++ Redistributable

一、我大意了 一开始是Npcap装不上。 在这个网站下的&#xff1a; Wireshark (kafan58.com) 安装程序&#xff1a; 安装过程&#xff1a; 无语死了&#xff0c;感觉被骗了......外网下的才是最正版的。 二、外网正版 下载最新的4.4.8版本Wireshark重新安装 2.1 vc_runtime…

高通平台Wi-Fi Display学习-- 调试 Wi-Fi Display 问题

4.1 调试 WFD 性能 4.1.1 通过启用调节器模式验证 WFD 当系统设为调节器模式时,设备的运行时钟将达到峰值。要在系统中启用调节器模式,应 在序列中输入以下命令: 1. adb shell stop mpdecision 2. adb shell echo 1→/sys/devices/system/cpu/cpu1/online 3. adb shell…

5G专网与SD-WAN技术融合:某饮料智能工厂网络架构深度解析

随着工业互联网的快速发展&#xff0c;制造业正从传统的生产模式向智能化、数字化方向转型。某饮料智能工厂项目创新性地引入了5G专网与SD-WAN技术&#xff0c;形成了“连接-计算-应用-安全”的全链条网络架构。本文将深入剖析这两种技术在智能工厂中的应用场景、部署架构&…

Java项目:基于SSM框架实现的公益网站管理系统【ssm+B/S架构+源码+数据库+毕业论文+答辩PPT+远程部署】

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本公益网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&#x…

向华为学习——IPD流程体系之IPD术语

第一章 IPD体系 1.1集成产品开发IPD Integrated Product Development,IPD是一种领先的、成熟的产品开发的管理思想和管理模式。它是根据大量成功的产品开发管理实践总结出来的,并被大量实践证明的高效的产品开发模式。通过IPD,可建立起基于市场和客户需求驱动的集成产品开…

落霞归雁:从自然之道到“存内计算”——用算法思维在芯片里开一条“数据高速航道”

作者 落霞归雁&#xff08;CSDN首发&#xff0c;转载请注明&#xff09; 段落一 现象&#xff1a;当“摩尔”老去&#xff0c;数据却在狂奔 过去 30 年&#xff0c;CPU 频率翻了 60 倍&#xff0c;而 DRAM 带宽只翻了 20 倍。算力与带宽的剪刀差&#xff0c;让“计算”变成“等…

StyleX:Meta推出的高性能零运行时CSS-in-JS解决方案

简介 StyleX 是由 Meta 开发的零运行时 CSS-in-JS 解决方案&#xff0c;在构建时将样式编译为静态 CSS&#xff0c;消除运行时开销。 核心特性 零运行时开销 – 构建时编译为静态 CSS类型安全 – 完整的 TypeScript 支持原子化 CSS – 自动生成原子化类名&#xff0c;最小化…

LINUX 85 SHElL if else 前瞻 实例

问题 判断用户是否存在 id user id $user变量判断vsftpd软件包被安装 rpm -q vsftpd rpm -ql vsftpd >& null[rootweb ~]# rpm -ql vsftpd >/dev/null 2>&1 您在 /var/spool/mail/root 中有邮件yum install vsftpd 内核主版本判断 uname -rcut -d[rootweb ~]#…

2025 年非关系型数据库全面指南:类型、优势

非关系型数据库的分类与特点随着数据量呈指数级增长和数据类型日益多样化&#xff0c;传统关系型数据库在处理海量非结构化数据时面临着严峻挑战。非关系型数据库&#xff08;NoSQL&#xff09;应运而生&#xff0c;它摒弃了传统关系模型的约束&#xff0c;采用更灵活的数据存储…