https://github.com/khc-zhihao/miniwebsitepacker
簡單的網頁打包工具
https://github.com/khc-zhihao/miniwebsitepacker
buildtools html
Last synced: 8 months ago
JSON representation
簡單的網頁打包工具
- Host: GitHub
- URL: https://github.com/khc-zhihao/miniwebsitepacker
- Owner: KHC-ZhiHao
- License: mit
- Created: 2020-09-19T19:04:36.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2022-12-19T16:40:31.000Z (over 3 years ago)
- Last Synced: 2025-01-22T06:48:02.657Z (over 1 year ago)
- Topics: buildtools, html
- Language: TypeScript
- Homepage:
- Size: 784 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- License: LICENSE
Awesome Lists containing this project
README

Mini Website Packer
這是一個快速開發靜態網站的建置工具,不需要安裝太多東西就能發布純HTML檔案,協助轉換 JS 支援 es5、auto prefix CSS 等複雜行為,甚至可以根據語系編譯 HTML,還會順便幫你壓縮圖片,適合簡單的 DEMO 網站或是形象網站。
這個工具能做的不多,如果你有更複雜的需求請直接參考 webpack。
## 安裝
```bash
mkdir my-static-page
cd my-static-page
npm init
npm install mini-website-packer
npx mini-website-packer init
npx mini-website-packer serve --lang zh
```
## 開發與發佈
**開啟開發模式**
在開發模式中會有簡易的 hot reload 功能,選項 lang 可以指定使用哪種語言作為預覽。
```bash
npx mini-website-packer serve --lang zh
```
**打包程式**
打包後的結果會輸出在`dist`資料夾中,選項 mini 會壓縮文檔,選項 lang 則是選擇哪種語言作為主要語言,其他語言仍然會輸出自己的資料夾。
```bash
npx mini-website-packer build --babel --mini --lang zh
```
* 使用 --mini 即壓縮所有檔案。
* 使用 --babel 即支援相容舊瀏覽器。
> 如果使用 babel mode 出現 `regeneratorRuntime is not defined` 相關問題,必須引用 polyfill,可參考 [cdn](https://cdnjs.com/libraries/babel-polyfill)
**唯獨模式**
打包出來的檔案會經過複雜的加密過程,但仍然可以透過 HTML 上線,可以做為展示模式使用。
```bash
npx mini-website-packer build --readonly --readonlyhost localhost
```
## 說明
### 資料結構是固定的
locales、pages、static、templates 這四個資料夾是固定的。
### 語法介紹
#### 環境變數
在 html、css 文件裡面可以被替換掉的系統變數,通常以 --{name}-- 的方式命名。
##### env
會有 dev、prod 兩種型態,分別代表現在是開發狀態還是部屬狀態。
```js
// 編譯前
// 編譯後
```
##### lang
獲取當下編譯環境中的語系:
```js
// 編譯前
// 編譯後
```
##### 自定義
使用 `--conf config.json` 即可自定義自己的變數,例如我們定義主題顏色,如下:
```bash
# 部屬
npx mini-website-packer build --conf ./config.json --lang zh
# 開發
npx mini-website-packer serve --conf ./config.json --lang zh
```
config.json
```json
{
// variables 會將變數塞入所有檔案
"variables": {
"primary": "red"
},
// renderData 只會在渲染階段注入全域變數或是 Handlebars 變數。
"renderData": {
"users": ["dave", "james"]
}
}
```
src/static/style/index.css
```css
/* 編譯前 */
* {
color: --primary--
}
/* 編譯後 */
* {
color: red
}
```
##### 高階自定義
除了 config.json 外,也可以透過 js 來建構 config,只要副檔名是 `.js` 即可:
> 第一個參數 `handlebars` 即是 handlebars 的實例,可以讓使用者定義一些 helper 。
```bash
# 部屬
npx mini-website-packer build --conf ./mwp.confing.js --lang zh
```
mwp.confing.js
```js
module.exports = async({ handlebars }) => {
return {
variables: {
primary: '#EE8269',
secondary: '#221814'
}
}
}
```
#### 模板
使用``的標籤會在編譯過程中自動找尋`templates`檔案中相對應的檔案名稱,這個標籤**不支援任何Tag屬性**(例如: class),且必須使用``包裝起來,並使用``語法來表明插槽位置。
> 你也可以在模板中引用其他模板。
```html
Hello,
```
```html
Dave
```
以下是編譯後的結果:
```html
Hello,Dave
```
#### Handlebars
本庫原生支援 [Handlebars](https://handlebarsjs.com/),只要將`.html`檔案改為`.hbs`副檔名即可啟用,可以借助該模板工具的邏輯來建構你的靜態網頁。
> 所有的 `.hbs` 檔案吃的變數都來自 `config.renderData`,但變數有兩額佔位符,分別是 `vars(環境變數)` 與 `props(模板傳遞的值)`。
```html
{{#each users}}
{{this}}
{{/each}}
{{ props.text }}
```
以下是編譯後的結果:
```html
名字是:
dave
james
```
#### 渲染模板
可以使用 javascript 的邏輯來渲染模板,只要在 script 中加入關鍵字 render 就會在執行階段中執行,使用方式如下:
```html
Hello,
```
```html
return '<t-wrapper>Dave</t-wrapper>'
```
以下是編譯後的結果:
```html
Hello,Dave
```
你可以在此階段獲取到 `mwp` 物件,內部包含了 `variables`, `renderData`, `handlebars` 三個物件。
```html
return `<div>${mwp.variables.primary}</div>`
```
以下是編譯後的結果:
```html
red
```
由於 render 的執行過程是在編譯階段,且支援`非同步`函數,你可以透過外部工具來建構你的應用程式,例如:
```html
const axios = require('axios')
const users = await axios.get('./users')
const template = `
{{#each peoples}}
<div>{{ this }}</div>
{{/each}}
`
return mwp.handlebars.compile(template)({
peoples: users.data
})
```
以下是編譯後的結果:
```html
dave
james
```
#### Props
在**模板**中使用`-name-`意味著這個值必須從外部傳遞。
> 注意空白鍵是敏感的。
```html
Hello,-name-
Your age is -age-
```
```html
```
以下是編譯後的結果:
```html
Hello,Dave
Your age is 18
```
#### Template Script
有時候我們透過 `` 標籤開發並不方便,這裡提供一個專屬於 template 開發的方法:
```html
<!-- template/wrapper.html -->
<template script="-name-">
<div>
Hello,-name-
<div>
</template>
```
在與 html 相同檔案的路徑下建立一個同名的 js 檔案:
```js
// template/wrapper.js
// 系統會自動執行並閉包,並傳遞一個 args 參數
console.log(args)
```
以下是編譯後的結果:
```html
<div>
Hello,Dave
<div>
<script>
(function(args) {
console.log(args)
})("Dave")
```
#### Children Template
可以在 template file 內使用 `` 來表明這是一個子模板,可以用``來獲取定義的子模板。
> 你可以在模板中引用自己的子模板,協助簡潔化程式碼。
```html
Hello,
Hi,
```
```html
Dave
```
以下是編譯後的結果:
```html
Hi,Dave
```
#### Folder Template
當然也是可以透過資料夾管理,但資料夾必須在 template 裡面才會生效,要獲取資料夾結構的模板必須用 `|` 符號分離。
```html
Hello,
```
```html
Dave
```
#### Once
可以在 template file 內使用使用 `once` 標籤,就只會執行一次。
> 執行一次的程式碼最終會被編譯在程式碼最下方,請注意執行順序。
```html
Hello
div {
color: red
}
```
```html
```
以下是編譯後的結果:
```html
Hello
Hello
div {
color: red
}
```
#### Ref ID
在 template file 中如果使用 ref 屬性,那會在獲取該 template 階段的時候配置一組隨機 id ,並取代該檔案所有的 `ref--{id}` 宣告。
```html
Click Me!
document.getElementById('ref--click').addEventListener('click', () => alert('hello!'))
#ref--click {
cursor: pointer;
}
```
以下是編譯後的結果:
```html
Click Me!
document.getElementById('click-qkgepor').addEventListener('click', () => alert('hello!'))
#click-qkgepor {
cursor: pointer;
}
```
#### Script Scoped
給予 `scoped` 標籤會讓內部程式碼包上一組閉包。
```html
console.log('Hello.')
```
以下是編譯後的結果:
```html
(function() {
console.log('Hello.')
})()
```
#### Style Scope
給予 `scope` 標籤會讓內部 css 加上父類。
```html
div {
color: 'red'
}
```
以下是編譯後的結果:
```html
.parent div {
color: 'red'
}
```
#### 語系
使用`{text}`會去找尋locales檔案中指定的語系(預設是zh)並填入,該語系檔案必須是json檔。
> 語系在編譯過程中會產生自己的目錄,請勿在pages中建立其語系相同名稱的資料夾以避免衝突。
```js
// locales/zh.json
{
"name": "Dave"
}
```
```html
Hello {name}
```
以下是編譯後的結果:
```html
Hello Dave
```
### 從Static獲取靜態資源
當我們需要圖片或是管理css相關檔案時,請把檔案放在`static`中。
> 需注意的是該檔案會隨著編譯一起到專案的根目錄中,請勿在pages中建立static資料夾以避免衝突。
```html
```
## 高級註解
使用三減號註解可以在編譯過程中被移除,可以避免要交付的程式碼中包含自己的開發邏輯:
```html
-title-
```
使用警告註解可以在編譯過程中發出警告,目的在於給未定義的參數添加檢查提示:
```html
...
```