项目配置

本文档描述了项目配置的全部参数及使用方法。

配置一览表

项目全局配置

字段名类型可选值说明备注
templateTypeStringhtml[默认]、smartyweb端构建出的页面文件类型
projectNameString-web端构建出的页面文件名称
templateLangStringcml[默认]、vue视图层模版语法两种语法不可混用
platformsArray[String]['web','weex','wx','alipay','baidu']当前项目支持端配置
devOffPlatformArray[String]['web','weex','wx','alipay','baidu']dev模式下关闭部分端构建
buildOffPlatformArray[String]['web','weex','wx','alipay','baidu']build模式下关闭部分端构建
enableLinterBooleantrue[默认]、false是否开启chameleon的语法检查
checkObject-多态校验控制
check.enableBooleantrue[默认]、false是否开启多态语法校验
check.enableTypesArray[String]['Object','Array','Nullable']Object表示多态协议中传递数据为对象时不校验内部具体数据,Array表示多态协议中传递数据为数组时不校验内部具体数据,Nullable表示某些参数不是必传谨慎使用,确定的输入数据结构会提高代码维护性!
enableGlobalCheckBooleantrue、false是否开启全局变量校验
globalCheckWhiteListArray[String|RegExp] -文件校验白名单,配置后可不校验改文件
devPortNumber8000[默认]dev模式启动的web服务端口,默认从8000开始查找空闲端口
excludeBablePathArray[String|RegExp]-配置babel-loader不处理文件
cmssObject-cml相关配置,仅web端有效
cmss.remBooleantrue[默认]、false样式单位是否编译为rem
cmss.scaleNumber0.5[默认]cmss.rem为false时有效,尺寸换算规则 cpx * cmss.scale = px
baseStyleObject-禁用基础样式
baseStyle[platform]Booleantrue、false禁用该端基础样式,platfrom为:web|weex|wx|alipay|baidubaseStyle.web为false时不插入web端基础样式,其他端同理
cmlComponentsArray[String]['cml-ui']全局自动引入组件库当设置该项之后可以直接使用改库下所有组件,无需手动引入

平台内构建配置

平台内构建配置是针对某一端执行命令构建时的特殊配置

字段名类型可选值说明备注
publickPathString-静态资源发布路径设置该字段执行构建时静态资源地址将改为该地址
apiPrefixString-接口请求地址地址设置该字段调用请求时如果请求路径不是全路径则拼接该地址
hashBooleantrue[build默认]、false[dev默认]构建出的文件名是否带hash用于更新浏览器缓存
minimizeBooleantrue[build默认]、false[dev默认]构建出的文件是否进行代码压缩
hotBooleantrue[默认]、false控制是否开启热更新web端有效
analysisBooleantrue[默认]、false是否打开webpack打包分析工具
consoleBooleanfalse[默认]、true控制是否打开页面上的调试窗口web端有效
definePluginObject-定义运行时内部变量
moduleIdTypeStringnumber、hash、name设置webpack打包模块的id类型
babelPolyfillBoolean默认 false是否添加polyfillweb、weex端@babel/polyfill 小程序端miniapp_polyfill

配置文件

chameleon的构建过程是配置化的,项目的根目录下提供一个chameleon.config.js文件,在该文件中可以使用全局对象cml的api去操作配置对象。例如:

  1. // 设置静态资源的线上路径
  2. const publicPath = '//www.static.chameleon.com/static';
  3. // 设置api请求前缀
  4. const apiPrefix = 'https://api.chameleon.com';
  5. // 合并配置
  6. cml.config.merge({
  7. templateType: 'html',
  8. projectName: 'Chameleon',
  9. base: {
  10. dev: {
  11. domain1: 'localhost',
  12. domain2: 'localhost'
  13. },
  14. build: {
  15. domain1: 'http://www.cml1.com',
  16. domain1: 'http://www.cml2.com',
  17. }
  18. },
  19. web: {
  20. dev: {
  21. hot: true,
  22. console: true
  23. },
  24. build: {
  25. publicPath: `${publicPath}/web`,
  26. apiPrefix
  27. }
  28. }
  29. })

配置api

  • cml.config.merge(obj) merge方式修改配置。
  • cml.config.assign(obj) assign方式修改配置
  • cml.config.get() 获取config配置

配置对象结构

配置对象的第一级为全局配置,例如projectName,全局配置中有各平台内的配置对象,例如web、wx、weex等。其中base对象用于配置各个平台对象的公共部分

平台对象内部分为各media的配置对象,例如dev、build

配置详解

下面就详细介绍配置中的功能。

web端页面文件类型

templateType, String 类型。该字段控制web端构建出的页面文件类型。

  • templateType: 'html' 构建出.html文件,纯前端模板
  • templateType: 'smarty' 构建出.tpl文件
    例如:
  1. cml.config.merge({
  2. templateType: 'html'
  3. });

web端页面文件名称

projectName, String 类型。

该字段控制web端构建出的模板文件名称,默认是当前项目的根目录文件夹名称。

例如:

  1. cml.config.merge({
  2. projectName: 'test_cml',
  3. templateType: 'html'
  4. })

web端构建出 test_cml.html文件

模板语法

templateLang, String 类型。chameleon的视图层支持两种模板语法,通过在template上的lang属性做区分,如果不写默认是cml语法。该字段控制init page 和init component 时生成的cml文件的template模板上的lang属性。例如:

  1. cml.config.merge({
  2. templateLang: 'cml'
  3. });

支持端配置

platforms, Array[String]类型。配置当前项目支持的端,该配置决定cml devcml build命令启动构建的端,决定cml init命令初始化多态接口和多态组件时只生成相应端代码。例如:

  1. cml.config.merge({
  2. platforms: ['web','wx'],
  3. });

cml devcml build只启动web和wx端的构建。

关闭某一端构建

devOffPlatform和buildOffPlatform, Array[String] 类型。当我们执行cml devcml build 时会自动构建输出所有平台的代码,可以通过这两个字段控制不需要构建的平台,目前支持取值["web","wx","weex"]。例如:

  1. cml.config.merge({
  2. devOffPlatform: ['wx'],
  3. buildOffPlatform: ['wx']
  4. });

语法检查

enableLinter, Boolean 类型。

默认为 true,是否开启chameleon的语法检查,会在命令行提示语法错误。例如:

  1. cml.config.merge({
  2. enableLinter: false
  3. })

多态校验控制

check, Object 类型。chameleon提供了接口多态与组件多态的写法,同时为了保证代码的质量提供了多态校验的方法,可以通过check字段进行校验的控制。

check.enable, Boolean 类型。 控制是否开启多态校验,默认true

check.enableTypes, Array[String] 类型。 可取值["Object","Array","Nullable"],控制校验中是否可以定义直接定义Object和Array类型,和是否可以定义可为空类型,默认值为[]。例如:

  1. cml.config.merge({
  2. check: {
  3. enable: true,
  4. enableTypes: ["Object","Array","Nullable"]
  5. }
  6. });

全局变量校验

enableGlobalCheck, Boolean 类型。默认是false,(chameleon-tool 0.2.0版本及之后默认为true),控制是否进行全局变量的检验。

例如:

  1. cml.config.merge({
  2. enableGlobalCheck: true
  3. });

全局变量校验白名单

globalCheckWhiteList, Array[String|RegExp] 类型。

chameleon内置了全局变量校验的功能 可以设置白名单不校验某些文件。以文件绝对路径进行匹配,可以是正则表达式径,也可以是字符串的endWiths。

例如:

  1. cml.config.merge({
  2. globalCheckWhiteList: ['jquery.js',/node_modules/]
  3. });

则所有以 jquery.js 结尾的文件以及 正则匹配 /node_modules/ 的不做校验;

dev服务端口

devPort, Number 类型。dev模式启动的web服务端口,默认是从8000开始寻找空闲端口,避免了启动多个项目时的端口冲突问题。如果想指定端口可以使用该参数进行配置。例如:

  1. cml.config.merge({
  2. devPort: 8080
  3. });

配置babel-loader不处理的文件

excludeBablePath, Array[String|RegExp] 类型。

  1. const path = require('path');
  2. cml.config.merge({
  3. excludeBablePath:[/test-exclude/,path.resolve(__dirname,'./src/excludes')],
  4. })

这个配置的结果会作为webpack模块配置中 Rule.exclude的值;

cmss处理

cmss,Object类型。仅用于web端。其中包含rem及scale属性,web端构建时默认将cpx转为rem,当不需要时转为rem时,将rem置为false,则scale参数生效,scale为像素缩放倍数,默认为1,会将cpx按照scale的设置进行缩放为px。例如:

  1. cml.config.merge({
  2. cmss: {
  3. rem: false,
  4. scale: 0.5
  5. }
  6. });

该设置web端cpx不转为rem,而缩小1倍转为px,例如10cpx转为5px。

禁用基础样式

baseStyle, Object类型。chameleon为了让各端样式统一,默认会在全局插入一些基础样式,如果开发者的跨端不需要这些基础样式,可以通过该参数进行设置。key值为端名称,value为Boolean值,是否插入基础样式。例如:

  1. cml.config.merge({
  2. baseStyle: {
  3. web: false,
  4. wx: false,
  5. weex: false
  6. },
  7. });

该设置web、wx、weex端均不插入基础样式。

全局引用npm组件库

cmlComponents, Array[String] 类型。当我们想把npm组件库中的组件全部自动引入,而不需要单独引入时,可以通过该字段配置npm包名称。例如 cml-ui是我们提供的一个npm组件库,可以进行如下配置:

  1. cml.config.merge({
  2. cmlComponents: ['cml-ui']
  3. });

npm组件库的package.json中的main字段可以指定路径,否则就会查找npm包中的所有cml文件自动引入,自动引入的组件名称为cml文件名称。

构建结果信息

buildInfo, Object 类型。buildInfo.wxAppId,String 类型。微信的appId。

当执行完cml build后会生成一个config.json文件,该文件存储构建后各平台的页面信息。可以通过这个json文件做页面的动态下发,页面降级等等。

例如:

  1. cml.config.merge({
  2. buildInfo: {
  3. wxAppId: '123456'
  4. }
  5. });

cml build 后生成在dist/config.json

  1. {
  2. "wx": {
  3. "appId": "123456",
  4. "path": "/pages/index/index"
  5. },
  6. "web": {
  7. "url": "https://api.chameleon.com/cml/h5/index"
  8. },
  9. "weex": {
  10. "url": "https://static.chameleon.com/pinche/hkcml/weex/hybridkits_pageone_e86b77ae05a015a3a546.js",
  11. "query": {
  12. "path": "/pages/index/index"
  13. }
  14. }
  15. }

config.json中微信小程序的appId是通过buildInfo配置生成,其他的页面信息是根据router.config.json中的配置生成。

例如:

  1. cml.config.merge({
  2. enableLinter: false
  3. });

构建入口与页面

默认的入口与页面集成在脚手架中,对于有特殊需求的开发者,chameleon提供了可以自定义web端构建入口与页面,weex端构建入口的功能。entry, Object 类型。entry.template, String 类型。 页面文件的绝对路径。entry.web, String 类型。 web端入口文件的绝对路径。entry.weex, String 类型。 wewx端入口文件的绝对路径。例如:

  1. var path = require('path');
  2. cml.config.merge({
  3. entry: {
  4. template: path.resolve('./src/index.html')
  5. web: path.resolve('./src/mian.web.js')
  6. weex: path.resolve('./src/main.weex.js')
  7. }
  8. })

平台内配置

每一个平台的构建会需要不同的配置,所以针对每一个平台会有一个平台配置对象,平台配置对象中又有多个media配置对象,例如dev或者build的配置。下面讲述的配置项都是放在media对象中。例如:wx web weex是平台对象,里面的dev和build是media对象。

  1. cml.config.merge({
  2. wx: {
  3. dev: {},
  4. build: {}
  5. },
  6. web: {
  7. dev: {},
  8. build: {}
  9. },
  10. weex: {
  11. dev: {},
  12. build: {}
  13. }
  14. });

文件指纹

文件指纹是文件的唯一标识,以文件的内容生成hash值作为文件名称的一部分。在开启强缓存的情况下,如果文件的 URL 不发生变化,无法刷新浏览器缓存。文件指纹用于更新浏览器的缓存。小程序端不需要文件指纹。 默认图片资源开启hash,build模式开启hash。通过hash字段配置。

hash, Boolean 类型。控制打包出的js和css文件是否带hash后缀,图片字体等静态资源自动带hash,其小程序端不支持hash参数。

例如:

  1. cml.config.merge({
  2. web: {
  3. dev: {
  4. hash: true
  5. }
  6. }
  7. })

下图为web端开启文件指纹的打包结果。工程配置  - 图1

代码压缩

为了减少资源网络传输的大小,通过压缩器对 js、css、图片进行压缩是一直以来前端工程优化的选择。在chameleon中只需要配置minimize参数。

minimize, Boolean 类型。

控制打包出的文件是否进行压缩。

例如:

  1. cml.config.merge({
  2. web: {
  3. dev: {
  4. minimize: true
  5. }
  6. }
  7. });

资源发布路径

publicPath, String 类型。控制代码中静态资源的引用路径,线上发布需要用到,media为dev时默认 小程序端是本地路径,web和weex端是当前dev服务的路径。例如:

  1. cml.config.merge({
  2. web: {
  3. build: {
  4. publicPath: "http://www.chameleon.com/static"
  5. }
  6. }
  7. });

热更新与自动刷新

热更新与自动刷新都是提高本地开发效率的手段,当项目中的源代码发生改变时,能够自动的在页面看到改变,其中热更新不需要重新刷新预览的页面。目前只有web端的开发支持热更新,通过hot参数配置dev模式默认自动刷新,web端可以选择开启热更新。

hot, Boolean 类型。

控制是否开启热更新,只在web端生效,开启热更新时,css代码不会单独分离出来,如果进行线上js代理本地js调试问题时,请关闭热更新。

例如:

  1. cml.config.merge({
  2. web: {
  3. dev: {
  4. hot: true
  5. }
  6. }
  7. });

打包资源分析

analysis, Boolean类型。

控制是否打开webpack打包分析工具, 内部使用的webpack-bundle-analyzer插件。

例如:

  1. cml.config.merge({
  2. web: {
  3. dev: {
  4. analysis: true
  5. }
  6. }
  7. });

调试窗口

console, Boolean类型。

控制是否打开页面上的调试窗口,只在web端有效,方便在真机上进行调试。

例如:

  1. cml.config.merge({
  2. web: {
  3. dev: {
  4. console: true
  5. }
  6. }
  7. })

内置变量

definePlugin, Object类型,内部使用webpack.DefinePlugin实现,定义运行时的内置变量。例如:

  1. cml.config.merge({
  2. web: {
  3. dev: {
  4. definePlugin: {
  5. 'process.env.TEST': JSON.stringify('CML_TEST')
  6. }
  7. }
  8. }
  9. })

api请求前缀

apiPrefix, String类型。这个配置与网络请求相关,在wx和weex项目中,ajax的请求不能像web端一样只写相对路径,而是要写带有域名的绝对路径,chameleon-api 这个基础库,提供了网络请求的api,get、post、request方法,该方法会在运行时将请求的相对路径上添加配置的apiPrefix。media是dev时 默认为当前dev服务的地址,不需要配置。 例如:chameleon.config.js

  1. // 设置api请求前缀
  2. const apiPrefix = 'http://api.chameleon.com';
  3. cml.config.merge({
  4. wx: {
  5. dev: {
  6. },
  7. build: {
  8. apiPrefix
  9. }
  10. }
  11. })
  1. <script>
  2. import cml from 'chameleon-api'
  3. class Index {
  4. methods = {
  5. sendGet() {
  6. cml.get({
  7. url: '/api/driver/getList',
  8. data: {
  9. name: 'cml',
  10. age: 18
  11. }
  12. }).then(res=>{
  13. console.log(res)
  14. }).catch(e=>{
  15. console.log(e)
  16. })
  17. }
  18. }
  19. };
  20. export default new Index();
  21. </script>

在执行cml wx dev命令构建的结果中,cml.get方法发送的请求是http://172.22.137.29:8000/api/driver/getList

在执行cml wx build命令构建的结果中,cml.get方法发送的请求是http://api.chameleon.com/api/driver/getList

模块标识类型

moduleIdType,String类型。设置webpack打包模块的id类型。

  • number 顺序排列的数组下标。
  • hash 利用 webpack.HashedModuleIdsPlugin() 模块的id类型为模块内容的hash值。
  • name 利用webpack.NamedModulesPlugin() 模块的id类型为文件的路径。
  • chameleon 用于build模式,模块的id类型为模块内容的hash,并且最终文件的hash也经过优化处理,根据文件内容绝对hash值。默认media为dev时 取值为name 方便开发调试, media为build时取值为chameleon 保证hash值由文件内容决定,更好的做缓存持久化。
    例如:
  1. cml.config.merge({
  2. web: {
  3. dev: {
  4. moduleIdType: "number"
  5. }
  6. }
  7. })

babelPolyfill

chameleon-tool@0.0.15开始支持 web端chameleon-tool@0.3.0-alpha.1 开始支持weex 各小程序端

babelPolyfill, Boolean 类型, 默认 false。一些es6+的语法,babel不会转义,例如Object.sssign、Object.entries等方法, 如果客户端运行环境不支持这些语法就会出错。其中web和weex端使用的是@babel/polyfill, 小程序端使用的是自写的一些方法的polyfill,参见miniapp_polyfill。 注意添加polyfill后会增加一些文件体积。

例如:

  1. cml.config.merge({
  2. base: {
  3. dev: {
  4. babelPolyfill: true
  5. },
  6. build: {
  7. babelPolyfill: true
  8. }
  9. }
  10. })

domain 多域名请求前缀

chameleon-tool@0.2.0-alpha.0 chameleon-api@0.3.0-alpha.4 开始支持

domain, Object 类型。一般配置在base对象中,作为所有平台的公共配置,dev模式中配置的localhost会替换成当前dev模式启动的web服务ip+端口。 具体使用文档参见api多域名mock

例如:

  1. cml.config.merge({
  2. base: {
  3. dev: {
  4. domain: {
  5. domain1: "localhost",
  6. domain2: "localhost"
  7. },
  8. },
  9. build: {
  10. domain: {
  11. domain1: "http://api.cml.com",
  12. domain2: "http://api2.cml.com"
  13. },
  14. }
  15. },
  16. })

自定义构建配置

如果我们需要多套构建配置,可以自定义一个media,比如设置weex.custom 对象,然后执行cml weex custom即可使用你设置的custom配置进行构建,但是不会启动dev服务和watch。例如:

  1. cml.config.merge({
  2. weex: {
  3. custom: {
  4. minimize: true,
  5. moduleIdType: "number"
  6. }
  7. }
  8. })

组件导出配置

组件导出相关的配置请参见组件导出介绍。

修改webpack配置

chameleon.config.js中可以通过api获取到构建之前的webpack配置并对其进行修改。使用方式:

  1. cml.utils.plugin('webpackConfig', function({ type, media, webpackConfig }, cb) {
  2. // cb函数用于设置修改后的配置
  3. cb({
  4. type,
  5. media,
  6. webpackConfig
  7. });
  8. });