svelte+vite+ts+melt-ui从0到1完整框架搭建
框架太“重”了:通常一个小型项目只由少数几个简单页面构成,如果使用 Vue 或者 React 这些框架来研发的话,有点“大材小用”了。构建的产物中包含了不少框架运行时代码(虚拟 DOM、响应式、状态管理等),这些代码对于小型项目而言是冗余的,它们影响了包体大小,进而影响页面的启动速度和执行性能。
打包太慢了:以 Vue CLI 为例,它的底层基于 Webpack,虽然 Webpack 具备更强大的功能和灵活性,但相比于 Vite、Esbuild 这些以速度为标杆的构建工具来说,它的速度确实慢了一些,影响了研发效率。
@
一、 创建基本项目
1.1 全局安装 Vite
通过 npm 全局安装 Vite
npm install vite
1.2 创建 Svelte 项目
Vite 原生支持直接通过脚手架创建 Svelte 项目,执行以下命令
npm create vite@latest
输入命令后选择如下
Project name: vite-svelte
? Select a framework: › - Use arrow-keys. Return to submit.
Vanilla
Vue
React
Preact
Lit
❯ Svelte
Solid
Qwik
Others
? Select a variant: › - Use arrow-keys. Return to submit.
TypeScript
❯ JavaScript
SvelteKit
基本项目创建完成
二、目录结构
根据上一步创建项目,项目的基本结构栓是完成了,但这样还是不够的,接下来介绍一下完整的项目目录
三、svelte路由配置
3.1 npm安装
项目中安装svelte-spa-router
npm install svelte-spa-router
3.2 定义router
- 每条路由都是一个普通的Svelte组件,包含标记、脚本、绑定等。任何Svelte组件都可以是路由。
- 路由定义只是一个JavaScript字典(对象),其中键是一个带有路径(包括参数等)的字符串,值是路由对象。
import Home from './routes/Home.svelte'
import Author from './routes/Author.svelte'
import Book from './routes/Book.svelte'
import NotFound from './routes/NotFound.svelte'
const routes = {
// Exact path
'/': Home,
// Using named parameters, with last being optional
'/author/:first/:last?': Author,
// Wildcard parameter
'/book/*': Book,
// Catch-all
// This is optional, but if present it must be the last
'*': NotFound,
}
3.2.1 动态导入组件
使用动态导入的优点是,如果您的打包器支持,您可以启用代码拆分并减小发送给用户的捆绑包的大小。这已经用包括Rollup和Webpack在内的捆绑器进行了测试
- 要使用动态导入的组件,您需要利用包装方法(根据路线包装文档,该方法可用于各种操作)。首先,导入wrap方法:
import {wrap} from 'svelte-spa-router/wrap'
- 然后,在路由定义中,使用wrap方法包装路由,将一个函数传递给asyncComponent属性,该函数将动态导入的组件返回给asyncComponent:
wrap({
asyncComponent: () => import('./Foo.svelte')
})
案例:
// Import the wrap method
import {wrap} from 'svelte-spa-router/wrap'
// Note that Author and Book are not imported here anymore, so they can be imported at runtime
import Home from './routes/Home.svelte'
import NotFound from './routes/NotFound.svelte'
const routes = {
'/': Home,
// Wrapping the Author component
'/author/:first/:last?': wrap({
asyncComponent: () => import('./routes/Author.svelte')
}),
// Wrapping the Book component
'/book/*': wrap({
asyncComponent: () => import('./routes/Book.svelte')
}),
// Catch-all route last
'*': NotFound,
}
3.2.2 在页面之间导航
- 锚点导航
<a href="#/book/123">Thus Spoke Zarathustra</a>
- use:link导航(可以使用use:link操作,而不必在每个链接前键入#)
<script>
import {link} from 'svelte-spa-router'
</script>
<a href="/book/321" use:link>The Little Prince</a>
3.3 使用路由
在app.svelte中全局调用
import Router from 'svelte-spa-router'
然后,通过将组件放置在标记中,将路由器显示在您想要的任何位置
<body>
<Router {routes}/>
</body>
四、svelte CSS预处理器
4.1 less的使用
4.1.1 npm安装
安装less与svelte-preprocess-less依赖
npm install --save-dev svelte-preprocess-less less
在vite.config.js进行配置
import { less } from 'svelte-preprocess-less'
export default defineConfig({
plugins: [svelte({
preprocess: {
style: less(),
},
})],
})
4.2 Tailwind CSS的使用
通过npx安装直接配置完 tailwindcss
npx sv add tailwindcss
五、svelte环境变量配置
Vite中使用环境变量主要通过.env文件来配置,这些文件根据不同的环境(开发、测试、生产等)有不同的命名规则和使用方式。
5.1 环境变量命名规则
所有环境变量必须以VITE_为前缀
VITE_API_URL=https://api.example.com
VITE_APP_TITLE=My Vite App
5.2 .env文件的使用
1. 通用环境变量:在项目的根目录下创建.env文件,用于定义所有环境通用的变量。
2. 特定环境变量:根据不同的环境需求,可以创建以下类型的.env文件:
.env.devt:仅在开发环境中使用。
.env.pro:仅在生产环境中使用。
.env.local:通用的本地配置文件,通常不提交到版本控制系统中。
.env.development.local:开发环境的本地配置文件。
.env.production.local:生产环境的本地配置文件
5.3 在代码中使用环境变量
console.log(import.meta.env.VITE_API_URL);
5.4 配置运行与打包环境
"scripts": {
"dev": "vite --mode dev",//运行dev环境
"dev-pro": "vite --mode pro",//运行pro环境
"build": "vite build",
"preview": "vite preview",
"check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json"
},
六、svelte国际化
svelte-i18n
是一个用于 Svelte 应用的国际化(i18n)库,它可以帮助你轻松地管理和切换应用中的多语言内容。以下是如何在 Svelte 项目中使用 svelte-i18n
的基本步骤:
6.1 安装 svelte-i18n
首先,确保你已经安装了 svelte-i18n
。根据你的 package.json
文件,它已经存在于 dependencies
中。
npm install svelte-i18n
6.2 初始化 svelte-i18n
在你的 Svelte 项目中,通常会在 src
目录下创建一个 i18n.js
或 i18n.ts
文件来初始化 svelte-i18n
。
// src/i18n.js
import { init, register, locale } from 'svelte-i18n';
// 注册默认语言
register('en', () => import('./locales/en.json'));
register('zh', () => import('./locales/zh.json'));
// 初始化并设置默认语言
init({
fallbackLocale: 'en',
initialLocale: 'en',
});
6.3 创建语言文件
在 src/locales
目录下创建语言文件,例如 en.json
和 zh.json
。
// src/locales/en.json
{
"welcome": "Welcome to Svelte App",
"greeting": "Hello, {name}!"
}
// src/locales/zh.json
{
"welcome": "欢迎使用 Svelte 应用",
"greeting": "你好, {name}!"
}
6.4 在 Svelte 组件中使用 svelte-i18n
你可以在 Svelte 组件中使用 $t
函数来获取翻译内容。
<script>
import { t } from 'svelte-i18n';
</script>
<h1>{$t('welcome')}</h1>
<p>{$t('greeting', { name: 'John' })}</p>
6.5 切换语言
你可以通过 locale.set
方法来动态切换语言。
<script>
import { locale } from 'svelte-i18n';
</script>
<button on:click={() => locale.set('en')}>English</button>
<button on:click={() => locale.set('zh')}>中文</button>
6.6 在 App.svelte
中引入 i18n.js
- 确保在
App.svelte
或你的主入口文件中引入i18n.js
。
<script>
import './i18n.js';
</script>
- 确保加载完i18n后在加载页面
<script>
import { locale } from "svelte-i18n";
import Router from "@/router/Router.svelte";
</script>
{#if $locale}
<Layout>
<Router />
</Layout>
{/if}
6.7 运行项目
使用 npm run dev
运行你的项目,你应该能够看到国际化内容并根据按钮切换语言。
6.8 构建项目
当你准备好发布项目时,使用 npm run build
来构建项目。
npm run build
6.9 预览项目
使用 npm run preview
来预览构建后的项目。
npm run preview
6.10 检查项目
使用 npm run check
来检查 Svelte 和 TypeScript 的类型。
npm run check
通过以上步骤,你应该能够在 Svelte 项目中成功使用 svelte-i18n
来实现国际化功能。
七、svelte接口请求
在 Svelte 项目中使用 axios
进行 HTTP 请求是非常常见的操作。以下是如何在 Svelte 项目中集成和使用 axios
的步骤:
7.1 安装 axios
首先,确保你已经安装了 axios
。根据你的 package.json
文件,它已经存在于 dependencies
中。
npm install axios
7.2 创建 axios
实例
为了更好的管理和配置 axios
,通常会在 src/utils
目录下创建一个 api.ts
或 api.js
文件来创建 axios
实例。
// src/utils/api.ts
import axios from 'axios';
const api = axios.create({
baseURL: 'https://api.example.com', // 你的 API 基础 URL
timeout: 10000, // 请求超时时间
headers: {
'Content-Type': 'application/json',
},
});
export default api;
7.3 在 Svelte 组件中使用 axios
你可以在 Svelte 组件中导入并使用 axios
实例来发送 HTTP 请求。
<script lang="ts">
import api from '@/utils/api';
import { onMount } from 'svelte';
let data: any;
onMount(async () => {
try {
const response = await api.get('/endpoint');
data = response.data;
} catch (error) {
console.error('Error fetching data:', error);
}
});
</script>
{#if data}
<div>
<h1>{data.title}</h1>
<p>{data.description}</p>
</div>
{/if}
7.4 处理请求和响应拦截器
你可以在 axios
实例中添加请求和响应拦截器,以便在请求发送前或响应到达后进行一些处理。
// src/utils/api.ts
import axios from 'axios';
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 10000,
headers: {
'Content-Type': 'application/json',
},
});
// 请求拦截器
api.interceptors.request.use(
(config) => {
// 在请求发送之前做一些处理,例如添加 token
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
// 响应拦截器
api.interceptors.response.use(
(response) => {
// 对响应数据做一些处理
return response;
},
(error) => {
// 对响应错误做一些处理
return Promise.reject(error);
}
);
export default api;
7.5 在 App.svelte
中使用 axios
你可以在 App.svelte
中使用 axios
来获取数据或执行其他 HTTP 操作。
<script lang="ts">
import api from '@/utils/api';
import { onMount } from 'svelte';
let userData: any;
onMount(async () => {
try {
const response = await api.get('/user');
userData = response.data;
} catch (error) {
console.error('Error fetching user data:', error);
}
});
</script>
{#if userData}
<div>
<h1>Welcome, {userData.name}!</h1>
<p>Email: {userData.email}</p>
</div>
{/if}
7.6 处理错误
在使用 axios
时,确保你处理了可能的错误,例如网络错误或服务器错误。
<script lang="ts">
import api from '@/utils/api';
import { onMount } from 'svelte';
let userData: any;
let errorMessage: string | null = null;
onMount(async () => {
try {
const response = await api.get('/user');
userData = response.data;
} catch (error) {
errorMessage = 'Failed to fetch user data. Please try again later.';
console.error('Error fetching user data:', error);
}
});
</script>
{#if userData}
<div>
<h1>Welcome, {userData.name}!</h1>
<p>Email: {userData.email}</p>
</div>
{:else if errorMessage}
<p style="color: red;">{errorMessage}</p>
{/if}
通过以上步骤,你应该能够在 Svelte 项目中成功使用 axios
来进行 HTTP 请求。
八、svelte组件库
这里用的是melt-ui,访问地址是:https://www.melt-ui.com/docs/introduction
一键配置
npx @melt-ui/cli@latest init
九、svelte阿里图标库
在 Svelte 项目中使用阿里图标(如 iconfont)可以通过以下步骤实现:
9.1 获取阿里图标
- 访问 iconfont 并登录。
- 创建一个项目,将需要的图标添加到项目中。
- 选择
Font class
或Symbol
方式生成代码。 - 点击
下载至本地
,解压后得到图标文件。
9.2 将图标文件放入项目
将下载的图标文件(如 iconfont.css
和字体文件)放入项目的 public
或 src/assets
目录中。
例如:
public/
iconfont/
iconfont.css
iconfont.ttf
iconfont.woff
iconfont.woff2
9.3 引入图标文件
在 App.svelte
或 main.ts
中引入 iconfont.css
文件。
<script lang="ts">
import "./app.css";
import Layout from "@/layout/Layout.svelte";
import Router from "@/router/Router.svelte";
import { locale } from "svelte-i18n";
import Toast from "./components/Toast.svelte";
import { toast } from "@/utils/toastService";
// 引入阿里图标
import '../public/iconfont/iconfont.css';
</script>
9.4 使用图标
在 Svelte 组件中使用阿里图标,直接通过 class
引用图标类名。
<div>
<i class="iconfont icon-home"></i> <!-- icon-home 是图标类名 -->
<i class="iconfont icon-user"></i> <!-- icon-user 是图标类名 -->
</div>
9.5 动态切换图标
如果需要动态切换图标,可以将图标类名绑定到变量。
<script lang="ts">
let iconClass = 'icon-home';
</script>
<div>
<i class={`iconfont ${iconClass}`}></i>
<button on:click={() => iconClass = 'icon-user'}>切换图标</button>
</div>
9.6 使用 Symbol 方式(可选)
如果选择 Symbol
方式,需要引入 iconfont.js
文件,并使用 <svg>
标签。
<script lang="ts">
import '../public/iconfont/iconfont.js';
</script>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-home"></use> <!-- #icon-home 是图标 ID -->
</svg>
9.7 样式调整(可选)
如果需要调整图标大小或颜色,可以通过 CSS 设置。
<style lang="less">
.iconfont {
font-size: 24px;
color: #333;
}
</style>
9.8 示例代码
以下是一个完整的示例:
<script lang="ts">
import "./app.css";
import Layout from "@/layout/Layout.svelte";
import Router from "@/router/Router.svelte";
import { locale } from "svelte-i18n";
import Toast from "./components/Toast.svelte";
import { toast } from "@/utils/toastService";
// 引入阿里图标
import '../public/iconfont/iconfont.css';
let iconClass = 'icon-home';
</script>
{#if $locale}
<Layout>
<Router />
</Layout>
{#if $toast.visible}
<Toast message={$toast.message} />
{/if}
{/if}
<div>
<i class={`iconfont ${iconClass}`}></i>
<button on:click={() => iconClass = 'icon-user'}>切换图标</button>
</div>
<style lang="less">
.iconfont {
font-size: 24px;
color: #333;
}
</style>
通过以上步骤,你可以在 Svelte 项目中成功使用阿里图标。如果需要更多定制化功能,可以参考 iconfont 官方文档。
十、svelte轮播图
这里用的是https://3.swiper.com.cn/
下载引入相关css与js即可
demo如下
<script>
import { onMount } from 'svelte';
import '@/utils/swiper/swiper.min.js';
import '@/utils/swiper/swiper.min.css';
let swiperInstance;
onMount(() => {
// 初始化 Swiper
swiperInstance = new Swiper('.swiper-container', {
pagination: '.swiper-pagination',
paginationClickable: true,
autoplay:2500,
loop:true
});
});
</script>
<style>
html, body {
position: relative;
height: 100%;
}
body {
background: #eee;
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
font-size: 14px;
color:#000;
margin: 0;
padding: 0;
}
.swiper-container {
width: 100%;
height: 350px;
}
.swiper-slide {
text-align: center;
font-size: 18px;
background: #fff;
/* Center slide text vertically */
display: -webkit-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;
-webkit-box-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;
}
</style>
<!-- Swiper -->
<div class="swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
</div>
<!-- Add Pagination -->
<div class="swiper-pagination"></div>
</div>
十一、store数据共享
在 Svelte 中,store
是一个核心概念,用于管理应用的状态。为了更好地组织代码,可以将 store
封装为模块,包括 state
、actions
、getters
和 mutations
,类似于 Vuex 或 Redux 的设计模式。以下是如何封装 store
的示例:
1. 创建 store
模块
在 src/store
目录下创建一个模块,例如 centerStore.ts
,用于管理特定模块的状态和逻辑。
// src/store/centerStore.ts
import { writable, derived } from 'svelte/store';
// State
const state = writable({
userData: null,
loading: false,
error: null,
});
// Actions
const actions = {
async getUserData(params: { onlyMakeTheSame: boolean }) {
try {
state.update((s) => ({ ...s, loading: true, error: null }));
// 模拟 API 调用
const response = await fetch('/api/user', { method: 'GET' });
const data = await response.json();
state.update((s) => ({ ...s, userData: data, loading: false }));
} catch (error) {
state.update((s) => ({ ...s, error: error.message, loading: false }));
}
},
};
// Getters
const getters = {
userData: derived(state, ($state) => $state.userData),
isLoading: derived(state, ($state) => $state.loading),
error: derived(state, ($state) => $state.error),
};
// Mutations (可选)
const mutations = {
setUserData(userData: any) {
state.update((s) => ({ ...s, userData }));
},
};
// 导出模块
export const centerStore = {
state,
actions,
getters,
mutations,
};
2. 创建全局 store
在 src/store/index.ts
中整合所有模块,创建一个全局 store
。
// src/store/index.ts
import { centerStore } from './centerStore';
export const store = {
center: centerStore,
};
3. 在组件中使用 store
在 Svelte 组件中导入并使用 store
。
<script lang="ts">
import { store } from '@/store/index';
import { onMount } from 'svelte';
// 获取 state 和 getters
const { state, getters } = store.center;
// 调用 action
function fetchData() {
store.center.actions.getUserData({ onlyMakeTheSame: false });
}
onMount(() => {
fetchData();
});
</script>
{#if $getters.isLoading}
<p>Loading...</p>
{:else if $getters.error}
<p style="color: red;">Error: {$getters.error}</p>
{:else if $getters.userData}
<div>
<h1>User Data</h1>
<pre>{JSON.stringify($getters.userData, null, 2)}</pre>
</div>
{/if}
<button on:click={fetchData}>Refresh Data</button>
4. 封装 store
的优势
- 模块化:将状态和逻辑按模块划分,便于维护和扩展。
- 复用性:
actions
和getters
可以在多个组件中复用。 - 可测试性:
actions
和mutations
可以单独测试。 - 清晰性:
state
、actions
、getters
和mutations
分离,代码结构更清晰。
5. 示例:about.svelte
中使用 store
根据你的 about.svelte
文件,可以这样使用 store
:
<script lang="ts">
import { t, locale } from "svelte-i18n";
import { toast } from '@/utils/toastService';
import { store } from '@/store/index';
function getData() {
store.center.actions.getUserData({ onlyMakeTheSame: false });
}
</script>
<h1>{$t("welcome")}</h1>
<p>{$t("about")}</p>
<button on:click={getData}>获取接口数据</button>
{#if $store.center.getters.isLoading}
<p>Loading...</p>
{:else if $store.center.getters.error}
<p style="color: red;">Error: {$store.center.getters.error}</p>
{:else if $store.center.getters.userData}
<div>
<h1>User Data</h1>
<pre>{JSON.stringify($store.center.getters.userData, null, 2)}</pre>
</div>
{/if}
通过以上步骤,你可以在 Svelte 项目中封装 store
,并实现 state
、actions
、getters
和 mutations
的分离,使代码更易于维护和扩展。
十二、扩展内容
这里由于使用的melt-ui没有toast提示于是做了一个全局组建toas.svelte
- 组建创建
<script>
import { fade } from "svelte/transition";
export let message = "";
export let duration = 3000; // 持续时间,单位毫秒
let visible = false;
const showToast = () => {
visible = true;
setTimeout(() => {
visible = false;
}, duration);
};
showToast(); // 显示Toast
</script>
{#if visible}
<div class="toast" transition:fade>
{message}
</div>
{/if}
<style>
.toast {
position: fixed;
top: 300px;
left: 50%;
transform: translateX(-50%);
padding: 10px 20px;
background-color: #333;
color: white;
border-radius: 5px;
z-index: 1000;
}
</style>
- toastService封装
import { writable } from 'svelte/store';
function createToast() {
const { subscribe, set, update } = writable({ message: '', visible: false });
function show(message, duration = 3000) {
set({ message, visible: true });
setTimeout(() => {
update(current => ({ ...current, visible: false }));
}, duration);
}
return {
subscribe,
show, // 公开show方法供外部调用
};
}
export const toast = createToast(); // 创建并导出toast服务实例
- 全局调用app.svelte
<script lang="ts">
import Toast from "./components/Toast.svelte";
import { toast } from "@/utils/toastService";
</script>
{#if $toast.visible}
<!-- 使用$来访问store的值 -->
<Toast message={$toast.message} />
<!-- 将消息传递给Toast组件 -->
{/if}
- 使用
import { toast } from '@/utils/toastService';
toast.show('Hello, this is a toast!')
十三、框架git地址
https://gitee.com/cyp926/svelte-vite
svelte+vite+ts+melt-ui从0到1完整框架搭建的更多相关文章
- Linux(CentOS 7)+ Nginx(1.10.2)+ Mysql(5.7.16)+ PHP(7.0.12)完整环境搭建
首先安装Linux系统,我以虚拟机安装来做示例,先去下载 VitualBox,这是一款开源的虚拟机软件,https://www.virtualbox.org 官网地址.或者是VMware,www.vm ...
- DJANGO-天天生鲜项目从0到1-001-环境框架搭建
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- vite+ts+vue3+router4+Pinia+ElmPlus+axios+mock项目基本配置
1.vite+TS+Vue3 npm create vite Project name:... yourProjectName Select a framework:>>Vue Selec ...
- 快速新建并配置一个eslint+prettier+husky+commitlint+vue3+vite+ts+pnpm的项目
前置准备 一台电脑 vscode pnpm vscode插件:ESLint v2.2.6及以上 vscode插件:Prettier - Code formatter v9.5.0及以上 vscode插 ...
- sencha touch在华为emotion ui 2.0自带浏览器中圆角溢出的bug
在华为emotion ui 2.0自带的浏览器中,给部分组件设置了圆角后会发现背景仍然是方的,内部边框是圆的, 对于这种bug, 只需在对应的设置圆角的css样式中加入 background-clip ...
- 袋鼠云出品!数栈UI 5.0全新体验升级,设计背后的故事
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 前言 数栈作为云原⽣⼀站式⼤数据开发平台,从2016年发布第⼀个版本 ...
- Apache Spark1.1.0部署与开发环境搭建
Spark是Apache公司推出的一种基于Hadoop Distributed File System(HDFS)的并行计算架构.与MapReduce不同,Spark并不局限于编写map和reduce ...
- Spark2.1.0——内置Web框架详解
Spark2.1.0——内置Web框架详解 任何系统都需要提供监控功能,否则在运行期间发生一些异常时,我们将会束手无策.也许有人说,可以增加日志来解决这个问题.日志只能解决你的程序逻辑在运行期的监控, ...
- DTcmsV4.0分析学习——(2)系统框架
2.1物理结构 共8个项目,Web为启动项 项目间相互依赖关系图: 2.2逻辑结构 DTcms V4.0轻量级CMS系统框架采用的是典型的三层架构(项目与三层架构并非直接对应关系,至于什么是三层架构这 ...
- UI自动化框架搭建之Python3
UI自动化框架搭建--unittest 使用的代码是Python3版本,与时俱进哈哈 解释一下我的框架目录接口(每个人框架的目录接口不一样,根据实际要求) common目录:公共模块,这个地方可以存放 ...
随机推荐
- biancheng-Thymeleaf教程
Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎.它与 JSP,Velocity,FreeMaker 等模板引擎类似,也可以轻易地与 Spring MVC 等 Web ...
- javascript对象学习笔记
目前所见的,在普通的JavaScript应用中和绝大多数人一样使用的是全局的方式.大概是因为JavaScript所定义的变量或函数默认就是全局的.为了是代码不至于太凌乱,变量不至于稀里糊涂的就被人重定 ...
- ctfshow--web12 glob和show_source命令执行
查看源代码有提示 以为是cmd命令解过输入linux命令愣是没反应后来输入phpinfo()才有回显 原来是被误导了. 一开始想的是直接写入一句话木马 点击查看代码 @eval($_POST['att ...
- 小程序 uni-app动态更改标题
uni-app动态更改顶部标题 uni-app uni.setNavigationBarTitle({ title: '编辑班级荣誉' }) 小程序 wx.setNavigationBarTitle( ...
- tomcat 自启动脚本(普通模式)
tomcat daemon模式启停脚本 https://www.cnblogs.com/wxp100/p/14846331.html tomcat 普通模式启停脚本 vi tomcatServer.s ...
- mongoDb 的启动方式
参考地址:https://www.cnblogs.com/LLBFWH/articles/11013791.html 一. 启动 1. 最简单的启动方式,前台启动,仅指定数据目录,并且使用默认的271 ...
- babel-loader 如何工作? 什么是babel-loader插件? babel-loader插件可以干什么? 如何制作一个babel-loader插件?
本文会介绍比较基本的编译知识和babel-loader运作原理 babel-loader 是什么? 作为老一派的打包工具, babel-loader 想必大家已经非常熟悉了.它长这样子 // webp ...
- Vulnhun靶机-kioptix level 4-sql注入万能密码拿到权限ssh连接利用mysql-udf漏洞提权
一.环境搭建 然后选择靶机所在文件夹 信息收集 本靶机ip和攻击机ip 攻击机:192.168.108.130 靶机:192.168.108.141 扫描ip 靶机ip为:192.168.108.14 ...
- redis - [06] redis-benchmark性能测试
题记部分 001 || 参数含义 002 || 测试100个并发,100000个请求 启动redis-server redis-server /etc/redis.conf 进行性能测试 redis- ...
- CUDA与Cython之BatchGather
技术背景 在前面一篇文章中,我们介绍过Cython+CUDA框架下实现一个简单的Gather算子的方法.这里演示Gather算子的升级版本实现--BatchGather算子.不过这里只是加了一个Bat ...