PS:安装 Node.js 就不介绍了,最新版本就 okcss
npm init -y
cnpm i koa --save
cnpm i supervisor --save-dev
复制代码
./app.jshtml
const Koa = require("koa");
const app = new Koa();
app.listen(3000,()=>{
console.log("server is running..")
});
复制代码
./package.jsonvue
···
"scripts": {
"start": "npm run dev",
"dev": "supervisor -i ./node_modules ./app.js"
},
···
复制代码
注意 supervisor -i ./node_modules ./app.js 这条命令! 要是不把 ./node_modules 排除掉的话,supervisor 会吃光你的内存,风扇狂转!
controller 么,先对路由下手就完了 ~node
cnpm i koa-simple-router --save
复制代码
./controllers/indexControllers.jses6
class IndexControllers {
constructor() {
}
actionIndex(ctx, next) {
ctx.body = "koa2 is running~~";
}
}
module.exports = IndexControllers;
复制代码
./controllers/index.jsnpm
const router = require("koa-simple-router");
const IndexController = require("./indexControllers");
const indexController = new IndexController();
module.exports = app => {
app.use(router(_ => {
_.get("/", indexController.actionIndex);
_.get('/index.html', indexController.actionIndex);
}))
};
复制代码
_.get("/", indexController.actionIndex);
_.get('/index.html', indexController.actionIndex);伪静态
json
const Koa = require("koa");
const app = new Koa();
// 注册路由
require("./controllers/index")(app);
app.listen(3000,()=>{
console.log("server is running..")
});
复制代码
OK! 咱们如今应能够启动服务了,
npm start
以后访问本地服务,就能够看到效果了,是否是还有点儿小激动?浏览器
app.js 里面的
app.listen(3000,()=>{console.log("server is running..")});
的3000
扔到入口文件不三不四,咱们能够把它放到另外的位置缓存
./config/index.jsbash
const config={
port:3000
};
module.exports(config);
复制代码
./app.js
const Koa = require("koa");
const app = new Koa();
const config = require("./config");
// 注册路由
require("./controllers/index")(app);
app.listen(config.port, () => {
console.log("server is running..")
});
复制代码
既然要优化端口,不如把
生产环境的 80 端口
和开发环境的 3000 端口
分开吧
cnpm i cross-env --save-dev
复制代码
./package.json
···
"scripts": {
"start": "npm run dev",
"dev": "cross-env NODE_ENV=development supervisor -i ./node_modules ./app.js"
},
···
复制代码
./config/index.js
const config = {};
if (process.env.NODE_ENV === "development") {
config.port = 3000;
} else if (process.env.NODE_ENV === "production") {
config.port = 80;
}
module.exports = config;
复制代码
那么问题来了,这些静态文件咱们得把它们加载进来呀
cnpm i koa-static --save
复制代码
./config/index.js
const path = require("path");
const config = {
staticDir: path.join(__dirname, "..", "assets")
};
if (process.env.NODE_ENV === "development") {
config.port = 3000;
} else if (process.env.NODE_ENV === "production") {
config.port = 80;
}
module.exports = config;
复制代码
./app.js
const Koa = require("koa");
const app = new Koa();
const config = require("./config");
const serve = require("koa-static");
// 注册路由
require("./controllers/index")(app);
// 加载静态文件
app.use(serve(config.staticDir));
app.listen(config.port, () => {
console.log("server is running..")
});
复制代码
在这里,咱们的模板引擎用的是 koa-swig.js
cnpm i koa-swig --save
cnpm i co --save
复制代码
注:
co
是历史遗留问题,用来把koa1
编译成koa2
./views/layouts/layout.html
这个将会是全部模板的“祖宗”
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
{% block head %}
{% endblock %}
{% block link %}
{% endblock %}
</head>
<body>
{% block content %}
{% endblock %}
{% block script %}
{% endblock %}
</body>
</html>
复制代码
./views/index.html
继承了 layout.html
{% extends './layout.html' %}
{% block title %} 图书管理首页 {% endblock %}
{% block link %}
<link rel="stylesheet" href="/styles/index.css">
{% endblock %}
{% block content %}
<div>
<h1>{{content}}</h1>
</div>
{% endblock %}
{% block script %}
<script src="/scripts/index.js"></script>
{% endblock %}
复制代码
./assets/styles/index.css
css
body{
background: #000;
}
h1{
color:greenyellow;
}
p{
color:yellow;
}
复制代码
./assets/scripts/index.js
js
const content = "你好koa~~";
console.log(content);
复制代码
./controllers/index.js
class IndexControllers {
constructor() {
}
async actionIndex(ctx, next) {
ctx.body = await ctx.render('index.html',{
content:"hello node!"
});
}
}
module.exports = IndexControllers;
复制代码
./config/index.js
const path = require("path");
const config = {
viewDir: path.join(__dirname, "..", "views"), // 把视图层加载引来
staticDir: path.join(__dirname, "..", "assets")
};
if (process.env.NODE_ENV === "development") {
config.port = 3000;
} else if (process.env.NODE_ENV === "production") {
config.port = 80;
}
module.exports = config;
复制代码
./app.js
const Koa = require("koa");
const app = new Koa();
const config = require("./config");
const serve = require("koa-static");
const render = require("koa-swig");
const co = require("co");
// 注册路由
require("./controllers/index")(app);
// 加载静态文件
app.use(serve(config.staticDir));
// 配置模板引擎
app.context.render = co.wrap(render({
root: config.viewDir, // 把视图层加载引来
autoescape: true,
cache: false, // 缓存
ext: 'html',
writeBody: false
}));
app.listen(config.port, () => {
console.log("server is running..")
});
复制代码
OK,咱们如今再看下
若是你作到这步了,那么胜利的曙光就要降了!
有人会问,如今的代码有什么问题吗?,有,并且很多。
你们回到 ./assets/scripts/index.js
文件,若是我新增了一行以下代码,那会怎样呢?
const content = "你好koa~~";
console.log(content);
export default content;
复制代码
很正常么,由于它不认识啊,另外若是浏览器不支持
es6
语法怎么办?
cnpm i babel @babel-cli --save-dev
cnpm i babel @babel-core --save-dev
cnpm i babel @babel-preset-env --save-dev
复制代码
./.babelrc
{
"presets": [
[
"@babel/preset-env",
{
"modules": "systemjs"
}
]
]
}
复制代码
···
"scripts": {
"start": "npm run dev",
"dev": "cross-env NODE_ENV=development supervisor -i ./node_modules ./app.js",
"build": "babel ./assets/scripts/index.js -o ./assets/scripts/index-bundle.js"
},
···
复制代码
{% extends './layouts/layout.html' %}
{% block title %} 图书管理首页 {% endblock %}
{% block link %}
<link rel="stylesheet" href="/styles/index.css">
{% endblock %}
{% block content %}
<div>
<h1>{{content}}</h1>
</div>
{% endblock %}
{% block script %}
<script type="module">
import ("/scripts/index.js").then((_) => {
console.log(_.default);
})
</script>
<script type="nomodule" src="https://cdn.bootcss.com/systemjs/6.2.5/system.min.js"></script>
<script type="nomodule">
System.import("/scripts/index-bundle.js").then((_) => {
console.log(_.default);
})
</script>
{% endblock %}
复制代码
在这里咱们引入了万能木块加载器
systemjs
好比咱们能够把
vue
当jQuery
用
./views/layouts/layout.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
{% block head %}
{% endblock %}
{% block link %}
{% endblock %}
</head>
<body>
{% block content %}
{% endblock %}
<script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script>
{% block script %}
{% endblock %}
</body>
</html>
复制代码
./assets/scripts/index.js
const content = "你好koa~~";
console.log(content);
const app6 = new Vue({
el: '#app-6',
data: {
message: 'Hello Vue!'
}
});
export default content;
复制代码
./views/index.html
{% extends './layouts/layout.html' %}
{% block title %} 图书管理首页 {% endblock %}
{% block link %}
<link rel="stylesheet" href="/styles/index.css">
{% endblock %}
{% block content %}
<div>
<h1>[[content]]</h1> // 注意!
</div>
<div id="app-6">
<p>{{ message }}</p>
<input v-model="message">
</div>
{% endblock %}
{% block script %}
<script type="module">
import ("/scripts/index.js").then((_) => {
console.log(_.default);
})
</script>
<script type="nomodule" src="https://cdn.bootcss.com/systemjs/6.2.5/system.min.js"></script>
<script type="nomodule">
System.import("/scripts/index-bundle.js").then((_) => {
console.log(_.default);
})
</script>
{% endblock %}
复制代码
注意!vue 和 swig 的模板引擎的标识符不能冲突
因此咱们还要改下配置文件
./app.js
const Koa = require("koa");
const serve = require("koa-static");
const render = require("koa-swig");
const config = require("./config");
const co = require("co");
const app = new Koa();
app.use(serve(config.staticDir));
app.context.render = co.wrap(render({
varControls:["[[","]]"],// 自定义模板语法
root: config.viewDir,
autoescape: true,
cache: false, // 缓存
ext: 'html',
writeBody: false
}));
require("./controllers")(app);
app.listen(config.port, () => {
console.log("图书管理平台启动成功...");
});
复制代码