# 淘宝镜像
-g 全局 --registry 仓库
npm install -g cnpm --registry=https://registry.npm.taobao.org
# 包管理工具 nvm
// 下载出错的话
// 0curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
// 用这个 git clone https://github.com/creationix/nvm.git ~/.nvm && cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash // 需要科学上网
- I/O 是昂贵的,分布式 I/O 是更安贵的
- NodeJS 适用于 IO 密集型不适用 CPU 密集型
# 课堂笔记
# glup
# 流清洗
清洗后只保留线上需要的文件
rollup-plugin-replace
gulp.task("configclean", function() {
gulp.src("./src/nodeuii/**/*.js").pipe(
rollup({
output: {
format: "cjs", //commonjs
},
input: "./src/nodeuii/config/index.js",
plugins: [
replace({
"process.env.NODE_ENV": JSON.stringify("production"),
}),
],
})
);
});
# gulp-sequence
让 gulp 平行的去执行
const gulpSequence = require("gulp-sequence");
let _task = ["builddev"];
if (process.env.NODE_ENV === "production") {
_task = gulpSequence("buildprod", "configclean");
}
gulp.task("default", _task);
# gulp js 审查
// gulpfile.js
const eslink = require("gulp-eslint");
gulp.task("link", function() {
gulp
.src("./src/nodeuil/**/*.js")
.pipe(eslint())
.pipe(eslint.format())
.pipe(eslint.failAfterError());
});
if (precss.env.NODE_ENV === "link") {
_task = gulpSequence("eslink");
}
.eslintrc.js
.eslintignore
npm install gulp-eslint --save-dev
// .eslintrc.js
module.exports = {
rules: {},
extends: "eslint:recommended",
globals: {},
env: {
"browser": true,
"node": true,
"es6": true
},
parserOptions: {
// 屏蔽 import
ecmaVersion: 6,
sourceType: "module"
}
}
// .eslintignore
tests/**/*.js
dist/**/*.js
node_modules/**
cp -r yd-web yd-web-back
# awilix
// 容器【路由】 service model 每一次请求都是new一个类
service自动的注入contoller
contoller 面向切面 插入build里
没有IOC容器 就不知道怎么把service给一个类
import Koa from "koa";
import { asClass, createContainer, Lifetime } from "awilix";
import {loadControllers, scopePerRequest } from "awilix-koa";
const app = new Koa();
const container = createContainer().register({
userService: asClass(/*...*/),
todoService: asClass(/*...*/)
})
app.use(scopePerRequest(container))
app.use(loadControllers("routes/*.js", {cwd: __dirname}))
app.listen(3000);
// ..........app.js
// 创建IOC容器
const container = createContainer();
// 容器加载service
container.loadModules(
[[
__dirname+"/service/*.js",
{
register: asClass
}
]],{
formatName: "camelCase",
resolverOptions: {
lifetime: Lifetime.SCOPED
}
})
// 添加中间件,将其传递给Awilix容器。将在上下文上附加一个作用域容器。 每次请求都是new一次类
app.use(scopePerRequest(container));
// 加在容错后,注册所有的路由 自动注入controllers
app.use(loadControllers(__dirname+"/routes/*.js", {cwd: __dirname}))
// .........router/users-api.js
// router 也是controller 这是把router和controller合并到一个
// controller action 的概念
import bodyParser from "koa-bodyparser";
import {route, GET, POST, before} from "awilix-koa";
import {authenticate} from "./your-auth-middleware";
@route("/users")
export default class UserAPI {
constructor({userService}){
// 想用那个service 就引哪一个
this.userService = userService;
}
@route("/:id")
@GET()
@before([authenticate()])
async findUser(ctx){
ctx.body = await this.userService.find(ctx.params.id)
}
@POST()
@before([bodyParser()])
async createUser(ctx){
ctx.body = await this.userService.create(ctx.request.body)
}
}
// services/todo-service.js
export default class TodoService{
constructor(todoStore){
this.todoStore = todoStore;
}
async find(params){
return this.todoStore.find(params);
}
async create(params){
}
}
# 装饰器
babel-plugin-transform-decorators-legacy
babel({
babelrc: false, // 关闭外侧 .babelrc
ignore: ["./src/nodeuii/config/*.js"],
plugins: ["transform-es2015-modules-commonjs", "transform-decorators-legacy"],
});
- LTS 长期支持版本
- BETA 测试版本