项目结构

通过 thinkjs 命令创建完项目后,项目目录结构类似如下:

  1. |-- nginx.conf
  2. |-- package.json
  3. |-- src
  4. | |-- common
  5. | | |-- bootstrap
  6. | | | |-- generate_icon.js
  7. | | | `-- middleware.js
  8. | | |-- config
  9. | | | |-- config.js
  10. | | | |-- env
  11. | | | | |-- development.js
  12. | | | | `-- production.js
  13. | | | |-- hook.js
  14. | | | |-- locale
  15. | | | | |-- en.js
  16. | | | | `-- zh-cn.js
  17. | | | `-- route.js
  18. | | |-- controller
  19. | | | `-- error.js
  20. | | `-- runtime
  21. | `-- home
  22. | |-- config
  23. | |-- controller
  24. | | |-- base.js
  25. | | `-- index.js
  26. | |-- logic
  27. | | `-- doc.js
  28. | `-- model
  29. |-- view
  30. | `-- zh-cn
  31. | |-- common
  32. | | |-- error_400.html
  33. | | |-- error_403.html
  34. | | |-- error_404.html
  35. | | |-- error_500.html
  36. | | `-- error_503.html
  37. | `-- home
  38. | |-- doc_index.html
  39. | |-- doc_search.html
  40. | |-- inc
  41. | | |-- footer.html
  42. | | `-- header.html
  43. | |-- index_changelog.html
  44. | |-- index_demo.html
  45. | `-- index_index.html
  46. `-- www
  47. |-- favicon.ico
  48. |-- index.js
  49. |-- production.js
  50. `-- static
  51. |-- css
  52. |-- img
  53. `-- js

:指定不同的模式创建的项目目录机构可能有细微的差别,但总体是类似的。

nginx.conf

nginx 的配置文件,建议线上使用 nginx 做反向代理。

src

源代码目录,使用 ES6 模式创建项目才有该目录。项目启动时会自动将 src 目录下的文件编译到 app 目录下。

如果没有使用 ES6 特性创建项目,则直接有 app/ 目录。

src/common

通用模块目录,项目目录都是按模块来划分的,common 模块下存放一些通用的处理逻辑。

src/common/bootstrap

项目启动目录,该目录下的文件会自动加载,无需手动 require

可以在这个目录下文件里定义一些全局函数、注册中间件等常用的功能。

定义全局函数
  1. // src/common/bootstrap/fn.js
  2. global.formatDate = obj => {
  3. ...
  4. }

这里定义了一个全局函数 formatDate,那么项目里任何地方都可以直接使用该函数。

注册中间件
  1. // src/common/bootstrap/middleware.js
  2. think.middleware('replace_image', http => {
  3. ...
  4. });

这里定义了一个中间件 replace_image,那么就可以在配置文件 hook.js 里将该中间件注册进去了。

:bootstrap 只能放在 common 模块里。

src/common/config

配置文件,这里放一些通用的配置。

其中:路由配置、hook 配置、本地化配置等必须放在这里。

  1. 'use strict';
  2. /**
  3. * config
  4. */
  5. export default {
  6. //key: value
  7. };

src/common/controller

控制器,放一些通用的控制器。其中 error.js 里错误处理的不同行为,项目里可以根据需要进行修改。

src/common/runtime

项目运行时生成的一些目录,如:缓存文件目录,用户上传的文件临时存放的目录。

src/home

home 模块,项目默认模块。可以在 src/common/config/config.js 中修改配置 default_module 来重新定义默认模块。

src/home/logic

逻辑处理。每个操作执行前可以先进行逻辑校验,可以包含:参数是否合法、提交的数据是否正常、当前用户是否已经登录、当前用户是否有权限等。这样可以降低 controller 里的 action 的复杂度。

  1. 'use strict';
  2. /**
  3. * logic
  4. * @param {} []
  5. * @return {} []
  6. */
  7. export default class extends think.logic.base {
  8. /**
  9. * index action logic
  10. * @return {} []
  11. */
  12. indexAction(){
  13. }
  14. }

src/home/controller

控制器。一个 url 对应一个 controller 下的 action

  1. 'use strict';
  2. import Base from './base.js';
  3. export default class extends Base {
  4. /**
  5. * index action
  6. * @return {Promise} []
  7. */
  8. indexAction(){
  9. //auto render template file index_index.html
  10. return this.display();
  11. }
  12. }

src/home/model

模型。数据库相关操作。

view

视图目录,存放对应的模版文件。如果支持国际化和多主题,那么视图目录下需要有对应的子目录。

www

项目的可访问根目录,nginx 里的根目录会配置到此目录下。

www/development.js

开发模式下项目的入口文件,可以根据项目需要进行修改。www/production.js 为线上的入口文件。

入口文件的代码类似如下,可以根据项目需要进行修改。

  1. var thinkjs = require('thinkjs');
  2. var path = require('path');
  3. var rootPath = path.dirname(__dirname);
  4. var instance = new thinkjs({
  5. APP_PATH: rootPath + '/app',
  6. ROOT_PATH: rootPath,
  7. RESOURCE_PATH: __dirname,
  8. env: 'development'
  9. });
  10. instance.compile({retainLines: true, log: true});
  11. instance.run();

www/static

存放一些静态资源文件。

原文: https://thinkjs.org/zh-cn/doc/2.2/app_structure.html