首页 > 其他分享 >前端模块化

前端模块化

时间:2024-08-01 17:27:29浏览次数:13  
标签:const 模块化 前端 导出 js export 模块 router

前端工程化、模块化

介绍:将项目(由多个模块组成)抽离为独立模块(例如pinia状态管理工具),利于维护,提高代码的复用性,按需加载,具有独立的作用域(防止变量污染);在Node.js中,每个文件都被视为一个单独的模块,使用特定的导入导出进行联系(如下);推荐使用ECMAScript模块标准。

在这里插入图片描述

CommonJS 模块标准

一般用于Node.js的项目环境中,作为Node.js打包JS代码的原始方式,Node.js还支持浏览器和其他JS运行时使用的ECMAScript模块标准(一般用于前端工程化项目中)

区分模块和路径:非自定义模块(fs,path,http,express等)直接写名字

​ 自定义模块:写模块文件路径(./utils.js)

导出使用语法:module.exports = {}/变量(exports.变量 =) 导入使用语法:require(‘模块名或路径’);

utils例子
  • utils.js导出
const baseURl = ''
const getBaseURL = ()=>{}

module.exports = { 
  对外属性名:baseURL
  // getBaseURL:getBaseURL
  // 同名变量可省略书写为
  getBaseURl
}
// exports === module.exports
  • 使用utils的页面;路径导入
const obj = require('./utils.js')
// obj就等于module.exports导出的对象
node中使用,以router和处理函数为例
  • router/user.js
const express = require('express');
// 创建路由对象
const router = express.Router();
   router.post
   ...
module.exports = router;
  • app.js
const userRouter = require('./router/user')
// app上注册路由
app.use('/api', userRouter)
node中使用,以router处理函数为例
  • router_handler/user.js
// 登录的处理函数
exports.login = (req, res) => {
  const userinfo = req.body
  const sqlSelect = `select *from ev_users where username=?`
  db.query(sqlSelect, userinfo.username, (err, results) => {
    // 执行sql语句失败
    if (err) return res.send({ status: 1, message: err.message })
    // 语句成功,查看数组
    if (results.length !== 1) return res.send({ status: 1, message: '用户名不存在' })
    // TODO:判断用户输入的密码和数据库里的密码是否一致
    // 数据库里的密码是通过bcrypt加密的
    const compareResult = bcrypt.compareSync(userinfo.password, results[0].password)
    // 密码不一样,登录失败
    if (!compareResult) return res.send({ status: 1, message: '密码错误' })
    // 生成token剔除密码和头像,user 中只保留了用户的 id, username, nickname, email 这四个属性的值
    const user = { ...results[0], password: '', user_pic: '' }
    // 生成token字符串
    const tokenStr = jwt.sign(user, config.jwtSecretKey, {
      expiresIn: '10h', // token 有效期为 10 个小时
      // expiresIn:'15m'
    })
    // 前缀在前端已经给了Bearer
    res.send({ status: 0, message: '登录成功', token: tokenStr })

  })
}
......
  • router/user.js
// 接受导出的对象
const userHandler = require('../router_handler/user');

// 登录
router.post('/login',expressJoi(reg_login_schema),userHandler.login);

ECMAScript标准

默认导出和导入

导出:

export default { } / 变量

导入:

import { 同名变量 } from '模块名或路径'

命名导出和导入

导出:

export const baseURL = ''
export const getBaseURL = () => {}

导入:

baseURL和getBaseURL是变量,值为模块内命名导出的同名变量的值

import { 同名变量 } from '模块名或路径'
import { baseURL,getBaseURL } from '模块名或路径'

以请求拦截器为例

@/utils/request.js

const baseURL = 'http://127.0.0.1:3007'
// axios实例
const instance = axios.create({
  //  TODO: 1.基本地址和超时时间
  baseURL,
  timeout: 100000
})

instance.interceptors.request.use(
  (config) => {
    // if (config.method === 'post') {
    config.headers['Content-Type'] =
      'application/x-www-form-urlencoded;charset=UTF-8'
    // }
    //  TODO: 2.请求拦截器
    // 如果仓库里有token值,加在请求头上
    const userStore = useUserStore()
    if (userStore.token) {
      config.headers.Authorization = `Bearer ${userStore.token}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

instance.interceptors.response.use(
  (response) => {
    //  TODO: 3.响应拦截器
    console.log(response)

    if (response.data.status === 0) {
      return response
    }
    ElMessage({ message: response.data.message || '服务异常', type: 'error' })
    return Promise.reject(response.data)
  },
  (error) => {
    ElMessage({ message: error.message || '服务异常', type: 'error' })
    console.log(error)
    if (error.response.status === 401) {
      console.log(error.response)
      router.push('/login')
    }
    return Promise.reject(error)
  }
)


export default instance
export { baseURL }
// 或者使用 export const baseURL = 'http://127.0.0.1:3007'
  • 使用基地址
import { baseURL } from '@/utils/request'
  • 使用请求拦截器
import request from '@/utils/request'

以pinia状态仓库统一管理为例简单语法(导入+导出)

import { createPinia } from 'pinia'
import persist from 'pinia-plugin-persistedstate'

const pinia = createPinia()
pinia.use(persist)

export default pinia

// import { useUserStore } from './modules/user'
// export { useUserStore }
export * from './modules/user'
// import { useCountStore } from './modules/counter'
// export { useCountStore }
export * from './modules/counter'



技巧:按需加载-命名;全部加载-默认

node项目初始化:npm init -y,会自动生成package.json

注意:Node.js默认支持CommJS标准语法,如需使用,需要在运行模块所在文件夹新建package.json文件并设置{ “type”:“module” }

标签:const,模块化,前端,导出,js,export,模块,router
From: https://blog.csdn.net/weixin_53649241/article/details/140710796

相关文章

  • JSEncrypt 传输加密 -前端
    1.有些特殊要求,要求前端传给后端参数时把一些密码,手机号等加密,具体使用方式如下引入 jsencrypt.min.js,我是在app中使用,有些 jsencrypt.min.js文件只支持h5,使用的时候会报错,这个jsh5,app都可以使用,js文件内容在最下面import{JSEncrypt}from'@/common/utils/jsencrypt.m......
  • 前端项目package.json文件引用本地依赖
    在前端项目的package.json文件中引用本地依赖,可以使用以下几种方式:1.使用file:前缀如果本地依赖是一个已经存在的目录,可以在package.json中使用file:前缀来引用它。{"dependencies":{"your-local-package":"file:../path-to-your-local-package"}}2.......
  • 我的前端项目
    qiankun微前端--是一种多个团队通过独立发布功能的方式来共同构建现代化web应用的技术手段与方法策略。该架构的核心价值--技术栈无关。主框架不限制应用技术栈--独立开发与部署。微应用仓库独立,前后端可独立开发,部署完成后主框架自动更新--增量升级。复杂场景下对当前系统......
  • 前端如何设置表格边框样式和单元格间距?
    前端如何设置表格边框样式和单元格间距?引言表格的基本概念基本结构示例一:基本表格样式CSS说明示例二:交替行颜色CSS说明示例三:固定表头CSS说明示例四:设置单元格间距HTMLCSS说明示例五:响应式表格CSSHTML说明实际工作中的使用技巧技巧一:优化单元格内的内容CSS技巧二:使......
  • 基于 STM32 的 NAS私有云盘搭建:集成LwIP 协议、HTTP/HTTPS、WEB前端技术栈(代码示例)
    项目概述在本项目中,我们将搭建一个基于STM32的NAS(网络附加存储)私盘,通过网络访问存储在外部SATA硬盘上的文件。该项目将使用STM32开发板、外接SATA硬盘、LwIP协议栈以及FATFS文件系统来实现文件的上传、下载和管理,用户可以通过简单的Web界面进行操作。系统设计......
  • 前端部署工具
    前端部署工具用electron写了一个通用的前端部署工具,支持SSH的理论上都可以使用该工具,使用nodejs实现模拟登陆以及上传文件到服务器并解压链接:https://pan.baidu.com/s/1rGnAO4X_xfv90UecuAMFkA?pwd=2mte提取码:2mte......
  • 记录--别想调试我的前端页面代码
    ......
  • 前端——jQuery中的事件与动画
    jQuery事件事件组成在jQuery中,一个事件由事件主体、事件类型、事件处理函数三个部分组成。//实现事件$("#button").click(function(){//...})//调用事件$("#button").click();鼠标事件常用的鼠标事件方法方法                  ......
  • 这本vue3编译原理开源电子书,初中级前端竟然都能看懂
    前言众所周知vue提供了很多黑魔法,比如单文件组件(SFC)、指令、宏函数、cssscoped等。这些都是vue提供的开箱即用的功能,大家平时用这些黑魔法的时候有没有疑惑过一些疑问呢。我们每天写的vue代码一般都是写在*.vue文件中,但是浏览器却只认识html、css、js等文件类型,明显是不认......
  • Nginx部署前端环境(Mac)
    Nginx部署前端环境(Mac)常用命令#启动nginxsudonginx#检查nginx是否已经启动成功ps-ef|grepnginx#如果显示有以下内容,说明启动成功nginx:masterprocessnginx:workerprocess#查看端口号占用lsof-i:端口号#如果什么都没显示,说明端口没有被占用#查看nginx.......