>  기사  >  웹 프론트엔드  >  ThinkJS 개발 구성 예제 튜토리얼

ThinkJS 개발 구성 예제 튜토리얼

零下一度
零下一度원래의
2017-07-26 18:02:582013검색

구성 파일은 모듈에 의해 정의됩니다.

thinkjs를 사용하면 개발자는 src/common/config/에서 직접 매개 변수를 구성하고 js 파일을 직접 추가할 수 있습니다. 파일 이름은 json 속성 이름 요구 사항만 충족하면 됩니다. . , 파일 콘텐츠는 다음 형식을 따릅니다. src/common/config/ 下面配置自己的参数,直接增加 js 文件即可,文件名只要符合 json 属性名要求即可,文件内容遵照如下格式:

// 新增文件 assets.js 键入如下内容'use strict';export default {
  // key: value};

文件内容只要符合一个 json 对象格式的定义即可。来看一个 log4js 的配置定义:

// log4js.js'use strict';export default {
  appenders: [{  type    : "console",  category: "console"},// 定义一个日志记录器{  type                : "dateFile",                 // 日志文件类型,可以使用日期作为文件名的占位符  filename            : "logs/",     // 日志文件名,可以设置相对路径或绝对路径  pattern             : "debug/yyyyMMddhh.txt",  // 占位符,紧跟在filename后面  absolute            : true,                   // filename是否绝对路径  alwaysIncludePattern: true,       // 文件名是否始终包含占位符  category            : "logInfo"               // 记录器名}
  ],
  levels   : {logInfo: "DEBUG"
  }        // 设置记录器的默认显示级别,低于这个级别的日志,不会输出}

配置文件属于静态设置,一般存放不经常变动的设置参数(当然可以在内存中更改配置参数的值,下面会详细说明)。

另外配置文件是以 ES6 格式导出变量定义的 js 文件,而非 json 文件,这里有个好处就是可以增加以 // 开头的注释说明。

细心的你肯定也发现了:除了 src/common/config 以外,src/home/ 模块下面也有个 config 文件夹。

一般来说按照配置文件的作用范围来定义和安排,是比较合理的做法。

比如:所有模块都会用到的配置放在 src/common/config 下面比较合适,而仅用于 home 模块的配置,放在 src/home/config 下面比较合适。

当配置文件多了之后,我们需要关注一下多个配置文件的加载顺序。

配置文件加载顺序

官网是这么描述配置文件加载顺序的:

框架默认的配置 -> 项目模式下框架配置 -> 项目公共配置 -> 项目模式下的公共配置 -> 模块下的配置

先问个问题:这五个配置都指的是哪里呢?

前两个可以忽略掉,那是 thinkjs 框架自身的配置设置,通常里面不会有我们项目会用到的配置参数。

第三个和第四个则是在不同的项目创建模式(项目创建模式参见 Node.js 国产 MVC 框架 ThinkJS 开发 入门(荆秀网))下的默认 config 配置文件夹,位置在:

# normal modethinkjs_normal/src/config/*# module modethinkjs_module/src/common/config/*

最后一个是指的在 module mode 下的项目,每个 module 自己的 config,位置在:

thinkjs_module/src/home/config/*

需要注意的是:多个配置文件最终会在 thinkjs 运行时被全部加载,并合并在一起(注意加粗文字)。

所以当存在多个配置文件时,需要注意配置参数的 key(即属性名)尽量不要重复,因为按照加载顺序,后加载的 key 的值会覆盖先加载的 key 的值,导致出现不希望的结果。

提示:教程主要讲解处于模块模式(moudule mode)下的开发方式。

自动切换配置文件

前面讲到我们可以在 src/common/config 下面放置配置文件,可以是全部配置参数都放在一个文件中,也可以分散在多个文件中。

有个常见的场景相信每个开发人员都会遇到:

有些配置参数是本地开发时才会用到,有些则是线上运行时才会用到。当开发完成在做持续集成时,配置参数上传时却发现开发参数和线上参数混合在一起。。。

thinkjs 在 src/common/config/env/ 下提供了三种配置参数环境,分别是 开发配置 development、生产配置 production、测试配置 testing,可以拯救我们的持续集成。

我们可以把项目配置分成三份一样属性名的参数,分别放在不同的配置环境中,这样在本地开发是 thinkjs 自动加载开发配置,持续集成后线上加载的是生产配置,是不是很方便~

开发配置

开发配置文件是:src/common/config/env/development.js

如前所述,开发配置适用于本地开发使用,那么 thinkjs 是怎么知道现在是哪个环境呢?

答案是:已经在 package.json 里面定义好了

{
  "scripts": {"start": "node www/development.js?1.1.11","compile": "babel src/ --out-dir app/","watch-compile": "node -e \"console.log(&#39;<npm run watch-compile> no longer need, use <npm start> command direct.&#39;);console.log();\"","watch": "npm run watch-compile"
  }}

可以看到 scripts.start 属性定义了我们直接使用 npm start 时具体执行的实际上是 node www/development.js

var thinkjs = require(&#39;thinkjs&#39;);var path = require(&#39;path&#39;);var rootPath = path.dirname(__dirname);var instance = new thinkjs({
  APP_PATH: rootPath + path.sep + &#39;app&#39;,
  RUNTIME_PATH: rootPath + path.sep + &#39;runtime&#39;,
  ROOT_PATH: rootPath,
  RESOURCE_PATH: __dirname,
  env: &#39;development&#39;  // <-- 这里定义了当前的 thinkjs 实例的运行环境});// Build code from src to app directory.instance.compile({
  log: true});instance.run();

파일 콘텐츠는 json 개체 형식의 정의만 준수하면 됩니다. log4js의 구성 정의를 살펴보겠습니다.
src/common/config/├── config.js  # 可以放置自己的配置├── db.js  # 数据库连接├── env  # 运行时配置,下面会详述│   ├── development.js│   ├── production.js│   └── testing.js├── error.js  # 错误配置├── hook.js  # 钩子配置├── locale  # 多语言版配置│   └── en.js├── session.js└── view.js  # 视图文件配置
🎜🎜구성 파일은 정적 설정이며 일반적으로 자주 변경되지 않는 설정 매개변수를 저장합니다. (물론 구성 매개변수의 값은 나중에 설명하겠지만 메모리에서 변경될 수 있습니다. 아래에서 자세히 설명합니다.) 🎜🎜또한 구성 파일은 json 파일이 아닌 변수 정의를 ES6 형식으로 내보내는 js 파일입니다. 여기서 장점은 //로 시작하는 주석을 추가할 수 있다는 것입니다. 🎜🎜주의 깊게 살펴보셨다면 src/common/config 외에도 src/home/ 아래에 <code>config 폴더가 있다는 사실을 발견하셨을 것입니다. 모듈 . 🎜🎜 일반적으로 구성 파일의 범위에 따라 정의하고 정리하는 것이 더 합리적입니다. 🎜🎜예: 모든 모듈에서 사용하는 구성은 src/common/config 아래에 배치하는 것이 더 적절하고 홈 모듈에만 사용되는 구성은 src/home에 배치해야 합니다. /config code> 다음이 더 적합합니다. 🎜🎜구성 파일이 너무 많으면 여러 구성 파일의 로드 순서에 주의해야 합니다. 🎜🎜구성 파일 로드 순서🎜🎜공식 웹사이트에서는 구성 파일 로드 순서를 다음과 같이 설명합니다. 🎜
🎜프레임워크 기본 구성-> 프로젝트 공개 구성-> 공개 구성 -> 모듈 아래 구성🎜
🎜먼저 질문하겠습니다. 이 5가지 구성은 어디를 참조합니까? 🎜🎜처음 두 개는 무시할 수 있습니다. 일반적으로 우리 프로젝트에서 사용할 구성 매개변수는 없습니다. 🎜🎜세 번째와 네 번째는 다양한 프로젝트 생성 모드의 기본 구성 구성 폴더입니다(프로젝트 생성 모드는 Node.js 국내 MVC 프레임워크 ThinkJS 개발 소개(Jingxiu.com) 참조). 위치는 🎜🎜
// development.js&#39;use strict&#39;;export default {
  site_name: "",
  site_title: "",
  site_keywords: "",
  site_description: "",
  db: {  // 这里的配置替代 db.jstype   : &#39;mysql&#39;,log_sql: true, //是否记录 sql 语句adapter: {  mysql: {host    : &#39;127.0.0.1&#39;,port    : &#39;3306&#39;,database: &#39;&#39;,user    : &#39;&#39;,password: &#39;&#39;,prefix  : &#39;thinkjs_&#39;,encoding: &#39;utf8&#39;  }}
  },
  jwt: { // 第三方模块的公共定义options: {  algorithm: &#39;HS128&#39;,  expiresIn: &#39;7d&#39;}
  },
  pay: {// 定义与在线支付接口相关的参数
  },
  backend: {// 定义管理后台相关的参数
  },
  home: {// 定义前端网站相关的参数
  },
  rest: {// 定义 REST API 相关的参数
  },
  task: {// 定义 crond 相关的参数
  }};
🎜🎜 마지막은 모듈 모드의 프로젝트를 나타냅니다. 각 모듈에는 자체 구성이 있습니다. 위치는 🎜🎜
// 配置 development.jslet dbOpt = this.config(&#39;db&#39;);let jwtOpt = this.config(&#39;jwt.options&#39;);
🎜🎜thinkjs가 실행될 때 결국 여러 구성 파일이 로드되고 함께 병합됩니다. (굵은 텍스트에 유의하세요). 🎜🎜따라서 여러 구성 파일이 있는 경우 구성 매개변수의 키(속성 이름)를 반복하지 않도록 주의해야 합니다. 왜냐하면 로드 순서에 따라 나중에 로드된 키는 먼저 로드된 키 값을 덮어쓰므로 바람직하지 않은 결과가 발생합니다. 🎜🎜팁: 튜토리얼에서는 주로 모듈 모드에서의 개발 방법을 설명합니다. 🎜🎜자동으로 구성 파일 전환🎜🎜앞서 언급했듯이 구성 파일을 src/common/config 아래에 배치할 수 있습니다. 모든 구성 매개변수는 하나의 파일에 배치하거나 분산시킬 수 있습니다. 여러 파일에. 🎜🎜모든 개발자가 직면하게 될 일반적인 시나리오는 다음과 같습니다. 🎜🎜일부 구성 매개변수는 로컬 개발에만 사용되고 일부는 온라인 작업에만 사용됩니다. 개발이 완료되고 지속적인 통합이 진행되는 과정에서 구성 매개변수를 업로드할 때 개발 매개변수와 온라인 매개변수가 혼합되어 있는 것으로 확인되었습니다. . . 🎜🎜thinkjs는 src/common/config/env/ 아래에 세 가지 구성 매개변수 환경, 즉 개발 구성 development 및 프로덕션 구성 production, 테스트 구성을 제공합니다. 테스트를 통해 지속적인 통합을 유지할 수 있습니다. 🎜🎜프로젝트 구성을 동일한 속성 이름을 가진 세 개의 매개변수로 나누어 서로 다른 구성 환경에 배치할 수 있습니다. 이런 방식으로 thinkjs는 로컬 개발 중에 개발 구성을 자동으로 로드하며, 이후에는 프로덕션 구성이 온라인으로 로드됩니다. 엄청 편리하지 않나요?~🎜

개발 구성

🎜개발 구성 파일은 src/common/config/env/development.js🎜🎜위에서 언급했듯이 개발 구성은 로컬 개발 용도에 적합합니다. 그런데 thinkjs는 현재 어떤 환경인지 어떻게 알 수 있나요? 🎜🎜정답은 package.json에 정의되어 있습니다🎜🎜
// 配置 development.jslet jwtOpt = this.config(&#39;jwt.options&#39;);console.log(jwtOpt);// 读取成功,打印:// {//   options: {//     algorithm: &#39;HS128&#39;,//     expiresIn: &#39;7d&#39;//   }// }let jwtOptAlg = this.config(&#39;jwt.options.algorithm&#39;);console.log(jwtOptAlg);// 超过三层,读取失败,只能读取到两层内容,打印:// {//   options: {//     algorithm: &#39;HS128&#39;,//     expiresIn: &#39;7d&#39;//   }// }jwtOptAlg = jwtOpt[&#39;algorithm&#39;];console.log(jwtOptAlg);// 正确的读取方式,打印:// HS128
🎜🎜 npm start를 직접 사용하면 scripts.start 속성이 특정 실행을 정의하는 것을 볼 수 있습니다. code> 실제로는 node www/development.js 명령입니다. 🎜🎜답변을 묻는 원칙에 맞춰 이 파일에 무엇이 있는지 살펴보겠습니다. 🎜🎜
// 配置文件:src/home/config/assets.jslet siteName = think.config(&#39;assets.site_name&#39;, undefined, &#39;home&#39;);
🎜

:-)

生产配置

生产配置文件是:src/common/config/env/production.js

明白了开发配置的原理,也就不难明白生产配置了。

使用 node www/production.js 命令可以告诉 thinkjs 现在运行的是生产环境。

同理,生产配置中的参数名(属性名)一般与开发配置一样,只是值不同而已。

比较常见的是数据库连接,本地开发时连接的是测试库,而生产环境中连接的是生产库,不同的地址、用户、密码和库名,这些都是要交给运维人员来管理了。

测试配置

测试配置文件是:src/common/config/env/testing.js

明白了前两个配置,这个也不难明白~

使用 node www/testing.js 命令可以告诉 thinkjs 现在运行的是测试环境。

定义和使用配置文件

前面其实有介绍过配置文件的分布原则和定义方法,只要确保不与系统特定配置冲突即可自由定义。

系统特定配置

下面是 thinkjs 默认的配置文件清单,这些系统特定配置都是有相应的使用场景和参数设置,详细说明及完整参数详见:

src/common/config/├── config.js  # 可以放置自己的配置├── db.js  # 数据库连接├── env  # 运行时配置,下面会详述│   ├── development.js│   ├── production.js│   └── testing.js├── error.js  # 错误配置├── hook.js  # 钩子配置├── locale  # 多语言版配置│   └── en.js├── session.js└── view.js  # 视图文件配置

自定义配置

一般做法是使用带有层级的配置定义来组织配置参数(当然你一定要把全部参数都放在根下面也不是不可以),参见如下配置:

// development.js&#39;use strict&#39;;export default {
  site_name: "",
  site_title: "",
  site_keywords: "",
  site_description: "",
  db: {  // 这里的配置替代 db.jstype   : &#39;mysql&#39;,log_sql: true, //是否记录 sql 语句adapter: {  mysql: {host    : &#39;127.0.0.1&#39;,port    : &#39;3306&#39;,database: &#39;&#39;,user    : &#39;&#39;,password: &#39;&#39;,prefix  : &#39;thinkjs_&#39;,encoding: &#39;utf8&#39;  }}
  },
  jwt: { // 第三方模块的公共定义options: {  algorithm: &#39;HS128&#39;,  expiresIn: &#39;7d&#39;}
  },
  pay: {// 定义与在线支付接口相关的参数
  },
  backend: {// 定义管理后台相关的参数
  },
  home: {// 定义前端网站相关的参数
  },
  rest: {// 定义 REST API 相关的参数
  },
  task: {// 定义 crond 相关的参数
  }};

配置参数按照层次组织之后,需要注意的一点是:获取配置的时候,不能无限制的 this.config(参数.参数.参数.参数) 下去,详见下面读取配置的几种方式描述。

几种读取配置的方式

配置文件定义之后,需要在项目运行的特别业务中读取(也可以设置)到配置参数的值,根据读取配置的位置的不同,thinkjs 提供了以下几种读取方式。

this.config()

这是使用率最高的读取配置方法,绝大多数位置都可以使用此方法来读取配置,比如 controller logic model service middleware 等地方。

// 配置 development.jslet dbOpt = this.config(&#39;db&#39;);let jwtOpt = this.config(&#39;jwt.options&#39;);

这里有一点需要注意:thinkjs 只能解析两层配置参数,超过的层级不予解析(源码中写死了仅返回两层)。

// 配置 development.jslet jwtOpt = this.config(&#39;jwt.options&#39;);console.log(jwtOpt);// 读取成功,打印:// {//   options: {//     algorithm: &#39;HS128&#39;,//     expiresIn: &#39;7d&#39;//   }// }let jwtOptAlg = this.config(&#39;jwt.options.algorithm&#39;);console.log(jwtOptAlg);// 超过三层,读取失败,只能读取到两层内容,打印:// {//   options: {//     algorithm: &#39;HS128&#39;,//     expiresIn: &#39;7d&#39;//   }// }jwtOptAlg = jwtOpt[&#39;algorithm&#39;];console.log(jwtOptAlg);// 正确的读取方式,打印:// HS128

think.config()

think.config 方法可以:

  • 无须考虑当前位置来读取配置参数(其内部运行方式类似 this.config )

  • 跨模块读取配置参数

对于前者可以无须思考当前所在的模块,更自由的读取配置参数。

对于后者则对开发多模块协作有着比较重要的意义,配置参数只有一份,不可能向不同的模块复制相同的配置,因此需要“一处配置、多处可用”。因此无须考虑“我在哪里读取配置”,只要考虑“我要读取哪里的配置”即可。

// 配置文件:src/home/config/assets.jslet siteName = think.config(&#39;assets.site_name&#39;, undefined, &#39;home&#39;);

方法的第二个参数设置为 undefined 是为了避免将读取动作变为设置动作。

方法的第三个参数标明了这个配置参数在哪个模块下面,一旦给定此参数,thinkjs 会认为 src/home/config/ 下面的配置是你需要读取的目标。

http.config()

http.config 方法实质上是 think.config() 的一个别名,可以读取和设置配置参数。

避免踩坑之正确读取参数

如果不能理解 thinkjs 设计配置文件读取策略的情况下,会无意中踩坑,如下便是一个例子,代码说话。

假设有两个配置文件 src/common/config/assets.jssrc/home/config/assets.js,其中有着一样的属性名:

// src/common/config/assets.jsexport default {
  "site_title": "my site"};// src/home/config/assets.jsexport default {
  "site_title": "my test"};// 两个配置参数属性名一样的情况下// 使用不同的读取方式// 注意 config 方法的上下文对象的不同// 会导致读取的结果的不同// src/home/controller/index.jslet assets = this.config(&#39;assets&#39;);let siteTitle = assets[&#39;site_title&#39;];console.log(&#39;siteTitle is: &#39;, siteTitle);// 打印:// my test// src/home/controller/index.jslet assets = think.config(&#39;assets&#39;, undefined, &#39;common&#39;);let siteTitle = assets[&#39;site_title&#39;];console.log(&#39;siteTitle is: &#39;, siteTitle);// 打印:// my site

明白了 thinkjs 配置文件加载顺序,就不会对上面发生的情况惊讶了~

如果你实在懒得去思考 this.configthink.config 两者的分别,建议你干脆使用后者,当读取参数只传入第一个参数时,它的表现与前者一致。这样貌似更有利于代码的维护~

避免踩坑之动态修改配置参数

当读取到了配置参数后,当然是可以动态修改其为新的值,以让后续的处理都读到新的值。动态修改方法也很简单:config 方法的第二个参数就是给定的新值。

let siteTitle = this.config(&#39;assets.site_title&#39;);console.log(siteTitle);// 打印:// my testthis.config(&#39;assets.site_title&#39;, &#39;test 123&#39;);siteTitle = this.config(&#39;assets.site_title&#39;);console.log(siteTitle);// 打印:// test 123

上面的动态修改方法其实平淡无奇,来看看更有趣的修改方法,如下:

let siteAuthor = this.config(&#39;assets.site_author&#39;);console.log(siteAuthor);// 打印:// {//   name: &#39;xxuyou.com&#39;,//   email: &#39;cap@xxuyou.com&#39;// }siteAuthor[&#39;name&#39;] = &#39;cap&#39;;siteAuthor = this.config(&#39;assets.site_author&#39;);console.log(siteAuthor);// 打印:// {//   name: &#39;cap&#39;,//   email: &#39;cap@xxuyou.com&#39;// }

假如上面的代码片段修改一下写法,就可以得到预期的效果,如下:

let siteAuthor = think.extend({}, this.config(&#39;assets.site_author&#39;)); // <-- 不同点在这里console.log(siteAuthor);// 打印:// {//   name: &#39;xxuyou.com&#39;,//   email: &#39;cap@xxuyou.com&#39;// }siteAuthor[&#39;name&#39;] = &#39;cap&#39;;siteAuthor = this.config(&#39;assets.site_author&#39;);console.log(siteAuthor);// 打印:// {//   name: &#39;xxuyou.com&#39;,//   email: &#39;cap@xxuyou.com&#39;// }

당분간 이 think.extend가 누구인지 상관없이 등호 왼쪽의 변수를 수정하면 구성 방법을 직접 수정하는 것과 같은 효과가 나타나는 이유는 무엇인가요? think.extend 是何方神圣,为啥修改等号左边的变量的效果跟直接修改配置方法是一样的?

原因其实很简单:

  1. thinkjs 内部会缓存配置参数。

  2. 配置参数的值是一个 Object 而不是 String

OK~

语言包

语言包其实本身可以作为 i18n 来单独描述,不过由于国际化在实际开发甚至架构过程中极少涉及到,因此这里简略描述。

src/config/locale/en.js

系统默认的英语语言环境,其中定义了相关的语言模版。

src/config/locale/zh-CN.js

规范起见,建议手工设立这个语言模版文件,并修改 src/common/config/local.js 中的 default 参数为 zh-CN

이유는 실제로 매우 간단합니다. 🎜
  1. 🎜thinkjs는 구성 매개변수를 내부적으로 캐시합니다. 🎜
  2. 🎜구성 매개변수의 값은 String이 아닌 Object입니다. 🎜
🎜OK~🎜

언어 팩

🎜언어 팩 자체는 실제로 i18n으로 별도로 설명할 수 있지만 국제화가 실제 개발이나 아키텍처 프로세스에 거의 관여하지 않기 때문에 그러므로 여기서는 간략하게 설명한다. 🎜

src/config/locale/en.js

🎜관련 언어 템플릿을 정의하는 시스템의 기본 영어 환경입니다. 🎜

src/config/locale/zh-CN.js

🎜표준화를 위해 이 언어 템플릿 파일을 수동으로 설정하고 src/common/config/local을 수정하는 것이 좋습니다. js 이 언어 템플릿을 활성화하는 기본 매개변수는 zh-CN입니다. 🎜

위 내용은 ThinkJS 개발 구성 예제 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.