master
commit
89d6c5a332
|
@ -0,0 +1,18 @@
|
|||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear on external disk
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
package-lock.json
|
||||
|
||||
node_modules
|
||||
.vscode-test
|
||||
out.js
|
||||
*.vsix
|
||||
*.css
|
|
@ -0,0 +1,10 @@
|
|||
jsxBracketSameLine: true
|
||||
jsxSingleQuote: true
|
||||
semi: false
|
||||
singleQuote: true
|
||||
printWidth: 100
|
||||
useTabs: false
|
||||
tabWidth: 2
|
||||
trailingComma: none
|
||||
bracketSpacing: true
|
||||
arrowParens: avoid
|
|
@ -0,0 +1,28 @@
|
|||
// A launch configuration that launches the extension inside a new window
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Run Extension",
|
||||
"type": "extensionHost",
|
||||
"request": "launch",
|
||||
"runtimeExecutable": "${execPath}",
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Extension Tests",
|
||||
"type": "extensionHost",
|
||||
"request": "launch",
|
||||
"runtimeExecutable": "${execPath}",
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}",
|
||||
"--extensionTestsPath=${workspaceFolder}/test/suite/index"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
.vscode/**
|
||||
.vscode-test/**
|
||||
node_modules/**
|
||||
test/**
|
||||
package-lock.json
|
||||
.travis.yml
|
||||
.gitignore
|
||||
index.js
|
||||
test.js
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2018
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -0,0 +1,25 @@
|
|||
# simple.http
|
||||
> 🔥 简单的http服务器, 方便临时调试html。
|
||||
|
||||
[![Version](https://vsmarketplacebadge.apphb.com/version-short/yutent.simple.http.svg)](https://marketplace.visualstudio.com/items?itemName=yutent.simple.http)
|
||||
[![Rating](https://vsmarketplacebadge.apphb.com/rating-short/yutent.simple.http.svg)](https://marketplace.visualstudio.com/items?itemName=yutent.simple.http)
|
||||
[![Installs](https://vsmarketplacebadge.apphb.com/installs/yutent.simple.http.svg)](https://marketplace.visualstudio.com/items?itemName=yutent.simple.http)
|
||||
|
||||
## 插件说明
|
||||
> 这插件只是应一个基友需求, 临时写的。如果你有其他的功能需求, 请在插件商店中`搜索其他插件`。
|
||||
|
||||
|
||||
## 插件使用
|
||||
> 在项目根目录中放置 `.httpserver`文件, 并配置好之后, 重启或重新加载窗口, 以启动服务。
|
||||
|
||||
|
||||
|
||||
## .httpserver 文件
|
||||
> 使用`.httpserver`来配置web服务器信息, 该文件应为一个json格式的。
|
||||
|
||||
```json
|
||||
{
|
||||
"port": 23333, // 默认使用 23333 端口, 如果被使用了, 会向上查找可用端口
|
||||
"enabled": true // 这里配置为 true 才会启动web服务
|
||||
}
|
||||
```
|
|
@ -0,0 +1,146 @@
|
|||
/**
|
||||
*
|
||||
* @author yutent<yutent.io@gmail.com>
|
||||
* @date 2022/04/09 18:26:35
|
||||
*/
|
||||
|
||||
const vsc = require('vscode')
|
||||
const { join } = require('path')
|
||||
const { parse } = require('url')
|
||||
const http = require('http')
|
||||
const fs = require('iofs')
|
||||
|
||||
const std = vsc.window.createOutputChannel('http.server')
|
||||
const decode = decodeURIComponent
|
||||
|
||||
const MIME_TYPES = {
|
||||
html: 'text/html;charset=utf-8',
|
||||
txt: 'text/plain;charset=utf-8',
|
||||
css: 'text/css;charset=utf-8',
|
||||
xml: 'text/xml;charset=utf-8',
|
||||
gif: 'image/gif',
|
||||
jpg: 'image/jpeg',
|
||||
webp: 'image/webp',
|
||||
tiff: 'image/tiff',
|
||||
png: 'image/png',
|
||||
svg: 'image/svg+xml',
|
||||
ico: 'image/x-icon',
|
||||
bmp: 'image/x-ms-bmp',
|
||||
js: 'application/javascript;charset=utf-8',
|
||||
json: 'application/json;charset=utf-8',
|
||||
mp3: 'audio/mpeg',
|
||||
ogg: 'audio/ogg',
|
||||
m4a: 'audio/x-m4a',
|
||||
mp4: 'video/mp4',
|
||||
webm: 'video/webm',
|
||||
ttf: 'font/font-ttf',
|
||||
woff: 'font/font-woff',
|
||||
woff2: 'font/font-woff2',
|
||||
other: 'application/octet-stream'
|
||||
}
|
||||
|
||||
MIME_TYPES.htm = MIME_TYPES.html
|
||||
MIME_TYPES.jpeg = MIME_TYPES.jpg
|
||||
MIME_TYPES.tif = MIME_TYPES.tiff
|
||||
|
||||
let root
|
||||
let enabled = false
|
||||
let port = 23333
|
||||
let baseUrl = 'http://127.0.0.1:' + port
|
||||
|
||||
std.out = function (...args) {
|
||||
std.appendLine('[simple.http]: ' + args.join(' '))
|
||||
}
|
||||
|
||||
function createServer() {
|
||||
if (port > 65535) {
|
||||
std.out('端口超出有效范围0-65535, 当前为: ' + port)
|
||||
enabled = false
|
||||
return
|
||||
}
|
||||
std.out(`尝试使用${port}端口...`)
|
||||
http
|
||||
.createServer(function (req, res) {
|
||||
let pathname = parse(req.url)
|
||||
.pathname.slice(1)
|
||||
.replace(/[\/]+$/, '')
|
||||
|
||||
pathname = decode(pathname) || 'index.html'
|
||||
|
||||
let file = join(root, pathname)
|
||||
let stat = fs.stat(file)
|
||||
let ext = pathname.split('.').pop()
|
||||
|
||||
res.setHeader('Access-Control-Allow-Origin', '*')
|
||||
res.setHeader('Access-Control-Allow-Headers', '*')
|
||||
res.setHeader('Cache-Control', 'no-store')
|
||||
res.setHeader('X-Powered-By', 'VS Code simple.http')
|
||||
|
||||
if (stat.isFile()) {
|
||||
res.setHeader('Accept-Ranges', 'bytes')
|
||||
res.setHeader('Content-Type', MIME_TYPES[ext] || MIME_TYPES.other)
|
||||
res.setHeader('Content-Length', stat.size)
|
||||
res.writeHead(200, 'OK')
|
||||
fs.origin.createReadStream(file).pipe(res)
|
||||
} else {
|
||||
res.setHeader('Content-Type', MIME_TYPES.html)
|
||||
res.setHeader('Content-Length', 0)
|
||||
res.writeHead(404, 'Not Found')
|
||||
res.end('')
|
||||
}
|
||||
})
|
||||
.listen(port)
|
||||
.on('error', err => {
|
||||
std.out(`${port}端口被占用~~~`)
|
||||
port++
|
||||
createServer()
|
||||
})
|
||||
.on('listening', _ => {
|
||||
baseUrl = 'http://127.0.0.1:' + port
|
||||
std.out('启动成功, 请访问', baseUrl)
|
||||
})
|
||||
}
|
||||
|
||||
function __init__() {
|
||||
let folders = vsc.workspace.workspaceFolders
|
||||
|
||||
if (folders && folders.length) {
|
||||
root = folders[0].uri.fsPath
|
||||
}
|
||||
if (root) {
|
||||
let file = join(root, '.httpserver')
|
||||
//
|
||||
if (fs.isfile(file)) {
|
||||
let conf = JSON.parse(fs.cat(file).toString())
|
||||
if (conf.enabled) {
|
||||
enabled = true
|
||||
port = conf.port || 23333
|
||||
|
||||
createServer()
|
||||
} else {
|
||||
std.out('发现配置文件, 但服务为 关闭状态')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function deactivate() {}
|
||||
|
||||
exports.activate = function (ctx) {
|
||||
__init__()
|
||||
|
||||
let cmd = vsc.commands.registerCommand('HttpServer.open', _ => {
|
||||
if (enabled) {
|
||||
let editor = vsc.window.activeTextEditor
|
||||
if (editor) {
|
||||
console.log(editor)
|
||||
|
||||
let pathname = editor.document.uri.fsPath.slice(root.length)
|
||||
|
||||
vsc.commands.executeCommand('vscode.open', baseUrl + pathname)
|
||||
}
|
||||
}
|
||||
})
|
||||
ctx.subscriptions.push(cmd)
|
||||
}
|
||||
exports.deactivate = deactivate
|
|
@ -0,0 +1,57 @@
|
|||
{
|
||||
"name": "simple.http",
|
||||
"displayName": "simple.http",
|
||||
"description": "🔥 简单的http服务器, 方便临时调试html",
|
||||
"version": "1.0.0",
|
||||
"publisher": "yutent",
|
||||
"author": "Yutent [@yutent]",
|
||||
"icon": "logo.png",
|
||||
"engines": {
|
||||
"vscode": "^1.28.0"
|
||||
},
|
||||
"categories": [
|
||||
"Other"
|
||||
],
|
||||
"activationEvents": [
|
||||
"*"
|
||||
],
|
||||
"main": "out.js",
|
||||
"contributes": {
|
||||
"commands": [
|
||||
{
|
||||
"command": "HttpServer.open",
|
||||
"title": "在浏览器中打开"
|
||||
}
|
||||
],
|
||||
"menus": {
|
||||
"editor/context": [
|
||||
{
|
||||
"when": "!inOutput",
|
||||
"command": "HttpServer.open",
|
||||
"title": "在浏览器中打开"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/yutent/http.server.git"
|
||||
},
|
||||
"keywords": [
|
||||
"http.server",
|
||||
"http server",
|
||||
"simple http",
|
||||
"yutent"
|
||||
],
|
||||
"scripts": {
|
||||
"start": "esbuild index.js --bundle --outfile=out.js --external:vscode --format=cjs --platform=node",
|
||||
"pack": "npm start -- --minify"
|
||||
},
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"iofs": "^1.5.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"esbuild": "^0.12.14"
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue