{"_id":"tua","_rev":"286-de3b70399cb6ef3a0c9ad77cf5b68568","name":"tua","time":{"modified":"2022-05-22T09:37:57.398Z","created":"2017-06-08T13:40:48.286Z","0.1.0":"2017-06-08T13:40:48.286Z","0.1.1":"2017-06-08T13:45:27.162Z","0.1.2":"2017-06-08T13:46:39.683Z","0.2.0":"2017-06-09T03:19:14.630Z","0.2.1":"2017-06-09T05:27:16.584Z","0.2.2":"2017-06-09T06:04:07.366Z","0.2.3":"2017-06-09T13:21:48.867Z","0.2.4":"2017-06-10T08:18:37.876Z","0.2.5":"2017-06-10T08:44:19.815Z","0.2.6":"2017-06-13T05:06:04.291Z","0.2.7":"2017-06-13T05:21:32.929Z","0.2.8":"2017-06-13T05:53:52.771Z","0.2.9":"2017-06-13T06:29:25.975Z","0.2.10":"2017-06-13T06:33:53.010Z","0.3.0":"2017-06-13T06:43:15.784Z","0.3.1":"2017-06-13T09:39:04.913Z","0.3.2":"2017-06-13T09:48:07.991Z","0.1.3":"2017-06-13T16:22:09.273Z","0.1.4":"2017-06-13T16:33:58.890Z","0.3.3":"2017-06-14T06:05:08.403Z","0.4.0":"2017-06-14T08:38:33.959Z","0.4.1":"2017-06-16T03:23:50.720Z","0.4.2":"2017-06-16T03:31:53.150Z","0.4.3":"2017-06-16T06:00:28.806Z","0.4.4":"2017-06-19T10:05:40.644Z","0.4.5":"2017-06-19T12:52:16.177Z","0.4.6":"2017-06-20T02:50:38.391Z","0.4.7":"2017-06-20T06:15:26.945Z","0.5.0":"2017-06-20T10:30:41.469Z","0.5.1":"2017-06-21T02:48:55.655Z","0.5.2":"2017-06-21T07:52:44.326Z","0.5.3":"2017-06-22T02:57:44.305Z","0.5.4":"2017-06-22T03:10:36.629Z","0.5.5":"2017-06-22T08:21:51.891Z","0.5.6":"2017-06-26T09:46:03.763Z","0.5.7":"2017-06-26T10:40:37.124Z","0.5.8":"2017-06-26T11:19:35.539Z","0.5.9":"2017-06-28T10:38:57.264Z","0.5.10":"2017-07-05T07:33:40.792Z","0.5.11":"2017-07-05T07:57:42.933Z","0.5.12":"2017-07-05T10:21:20.188Z","0.5.13":"2017-07-10T12:18:58.736Z","0.5.14":"2017-07-10T13:26:25.030Z","0.5.15":"2017-07-11T05:10:30.180Z","0.5.16":"2017-07-11T05:18:28.986Z","0.5.17":"2017-07-11T07:52:41.801Z","0.5.18":"2017-07-11T09:26:52.577Z","0.5.19":"2017-07-11T12:21:10.335Z","0.5.20":"2017-07-12T04:04:03.884Z","0.5.21":"2017-07-12T04:11:07.383Z","0.5.22":"2017-07-19T02:41:01.917Z","0.5.23":"2017-07-19T03:23:17.152Z","0.5.24":"2017-07-19T06:56:46.690Z","0.5.25":"2017-07-19T07:56:03.390Z","0.5.26":"2017-07-20T09:03:40.514Z","0.5.27":"2017-07-20T09:34:05.603Z","0.5.28":"2017-07-24T02:21:36.652Z","0.5.29":"2017-07-26T09:38:23.284Z","0.6.0":"2017-07-26T10:06:41.546Z","0.6.1":"2017-07-26T10:32:09.864Z","0.6.2":"2017-07-31T04:16:43.544Z","0.6.3":"2017-07-31T04:17:06.741Z","0.6.4":"2017-08-02T10:04:14.913Z","0.6.5":"2017-08-03T07:51:43.729Z","0.6.6":"2017-08-03T08:07:13.828Z","0.6.7":"2017-08-03T08:13:04.078Z","0.7.0":"2017-08-09T09:37:17.709Z","0.7.1":"2017-08-09T09:55:08.442Z","0.7.2":"2017-09-14T07:19:32.448Z","0.7.3":"2017-09-19T10:45:11.226Z","0.7.4":"2017-09-26T09:05:37.544Z","0.8.0":"2017-10-18T10:24:21.203Z","0.8.1":"2017-10-19T07:02:07.407Z","0.8.2":"2017-10-20T03:03:14.007Z","0.8.3":"2017-10-24T08:15:24.715Z","0.8.4":"2017-10-24T08:16:02.380Z","0.8.5":"2017-10-24T08:22:11.300Z","0.8.6":"2017-10-24T08:24:52.274Z","0.8.7":"2017-10-24T10:47:45.905Z","0.8.8":"2017-10-25T03:28:31.940Z","0.8.9":"2017-10-26T02:41:43.194Z","0.8.10":"2017-10-30T08:07:39.293Z","0.8.11":"2017-10-30T09:02:05.752Z","0.8.12":"2017-10-30T09:24:23.900Z","0.8.13":"2017-11-01T08:39:51.975Z","0.8.14":"2017-11-03T02:56:06.504Z","0.8.15":"2017-11-08T08:56:46.276Z","0.8.16":"2017-11-08T08:59:53.990Z","0.8.17":"2017-11-15T10:25:18.978Z","0.8.18":"2017-11-16T02:59:58.639Z","0.8.19":"2017-11-20T08:28:05.360Z","0.8.20":"2017-11-23T08:57:28.607Z","0.8.21":"2018-01-09T02:35:43.279Z","0.8.22":"2018-01-09T02:49:57.008Z","0.8.23":"2018-03-15T10:37:41.844Z","0.8.24":"2018-03-21T06:22:08.024Z","0.8.25":"2018-03-26T09:32:38.715Z","0.8.26":"2018-03-27T08:44:59.212Z","0.8.27":"2018-04-23T02:44:38.861Z","0.9.0":"2018-04-23T06:49:16.500Z","0.8.28":"2018-04-27T03:46:25.748Z","0.8.29":"2018-04-27T07:57:16.405Z","0.8.30":"2018-04-30T08:56:15.421Z","0.8.31":"2018-04-30T08:59:09.722Z","0.8.32":"2018-05-02T07:17:06.607Z","0.8.33":"2018-05-02T10:42:45.963Z","0.8.34":"2018-05-03T09:05:06.858Z","0.8.35":"2018-05-08T02:55:35.130Z","0.8.36":"2018-05-14T07:02:59.402Z","0.9.1":"2018-05-15T07:23:46.676Z","0.8.37":"2018-05-17T08:24:01.247Z","0.9.2":"2018-05-17T08:26:39.098Z","0.8.38":"2018-05-30T03:15:18.950Z","0.8.39":"2018-06-05T13:05:28.408Z","0.8.40":"2018-09-23T02:57:27.600Z","0.9.3":"2018-09-23T07:29:48.919Z","0.8.41":"2018-10-09T08:29:13.766Z","0.9.12":"2018-10-17T06:39:22.710Z","0.9.13":"2018-10-17T07:42:44.264Z","0.8.42":"2018-11-12T07:16:27.863Z","0.8.43":"2018-11-22T10:12:26.432Z","0.9.26":"2019-02-27T07:36:48.029Z","0.8.44":"2019-03-20T02:54:13.663Z","0.10.0-rc.0":"2019-07-31T06:35:56.204Z","0.10.0-rc.1":"2019-08-01T03:31:04.168Z","0.10.0-rc.2":"2019-08-01T03:43:29.702Z","0.10.0-rc.3":"2019-08-01T07:11:05.839Z","0.10.0-rc.4":"2019-08-01T08:37:03.546Z","0.10.0-rc.5":"2019-08-01T08:47:13.991Z","0.10.0-rc.6":"2019-08-01T10:05:36.080Z","0.10.0-rc.7":"2019-08-01T12:27:06.320Z","0.10.0-rc.9":"2019-08-01T16:42:35.091Z","0.10.0-rc.10":"2019-08-02T05:21:56.683Z","0.10.0-rc.11":"2019-08-02T06:03:34.037Z","0.10.0-rc.12":"2019-08-03T05:26:03.299Z","0.10.0-rc.13":"2019-08-03T07:17:45.117Z","0.10.0-rc.14":"2019-08-03T17:21:12.468Z","0.10.0-rc.15":"2019-08-04T05:55:31.252Z","0.10.0-rc.16":"2019-08-04T09:16:04.449Z","0.10.0-rc.17":"2019-08-05T02:18:24.370Z","0.10.0-rc.18":"2019-08-05T02:42:54.204Z","0.10.0-rc.19":"2019-08-05T06:33:52.728Z","0.10.0-rc.20":"2019-08-05T07:55:40.967Z","0.10.0-rc.21":"2019-08-05T08:09:02.290Z","0.10.0-rc.22":"2019-08-05T12:47:45.728Z","0.10.0-rc.23":"2019-08-06T15:41:45.220Z","0.10.0-rc.24":"2019-08-07T06:01:04.669Z","0.10.0-rc.25":"2019-08-07T09:10:36.653Z","0.10.0-rc.26":"2019-08-07T10:10:23.545Z","0.10.0-rc.27":"2019-08-07T12:21:35.348Z","0.10.0-rc.28":"2019-08-08T04:47:37.825Z","0.10.0-rc.29":"2019-08-08T05:14:06.338Z","0.10.0-rc.30":"2019-08-08T05:35:09.494Z","0.10.0-rc.31":"2019-08-08T11:41:12.689Z","0.10.0-rc.32":"2019-08-09T03:37:04.605Z","0.10.0-rc.33":"2019-08-09T04:26:15.036Z","0.10.0-rc.34":"2019-08-09T13:27:50.892Z","0.10.0-rc.35":"2019-08-09T14:38:55.731Z","0.10.0-rc.36":"2019-08-11T13:30:30.033Z","0.10.0-rc.37":"2019-08-11T16:30:04.536Z","0.10.0-rc.38":"2019-08-12T03:04:56.027Z","0.10.0-rc.39":"2019-08-13T13:09:52.539Z","0.10.0-rc.40":"2019-08-14T10:46:06.517Z","0.10.0-rc.41":"2019-08-19T02:16:46.119Z","0.10.0-rc.42":"2019-08-19T09:08:32.620Z","0.10.0-rc.43":"2019-08-19T10:38:20.736Z","0.10.0-rc.45":"2019-08-23T08:02:13.106Z","0.10.0-rc.46":"2019-08-23T14:03:07.520Z","0.10.0-rc.50":"2019-08-30T09:45:40.677Z","0.10.0-rc.51":"2019-08-30T10:50:04.928Z","0.10.0-rc.52":"2019-09-01T13:40:22.918Z","0.10.0-rc.53":"2019-09-02T07:16:15.546Z","0.10.0-rc.54":"2019-09-02T11:08:06.124Z","0.10.0-rc.55":"2019-09-04T03:28:55.785Z","0.10.0-rc.56":"2019-09-04T13:25:09.507Z","0.10.0-rc.57":"2019-09-10T02:59:11.519Z","0.10.0-rc.58":"2019-09-10T03:01:43.311Z","0.10.0-rc.59":"2019-09-10T13:07:53.101Z","0.10.0-rc.59.1":"2019-09-10T13:10:24.144Z","0.10.0":"2019-09-15T13:07:45.098Z","0.10.0-rc.60":"2019-09-18T03:38:32.138Z","0.10.1":"2019-09-25T09:26:17.845Z","0.10.2":"2019-10-11T09:00:10.712Z","0.10.3":"2019-10-22T07:25:38.165Z","0.10.4":"2019-10-22T10:54:22.233Z","0.10.5":"2019-10-31T03:53:48.590Z","0.10.6":"2019-11-20T07:36:29.444Z","0.10.7":"2019-12-10T12:19:38.630Z","0.10.8":"2019-12-11T06:09:15.113Z","0.10.9":"2019-12-17T12:25:35.229Z","0.10.10":"2019-12-24T11:21:15.223Z","0.10.11":"2020-02-04T14:29:01.480Z","0.10.12":"2020-02-25T10:49:46.356Z","0.10.13":"2020-04-13T01:59:51.121Z","0.10.14":"2020-04-14T07:27:23.096Z","0.10.15":"2020-05-01T07:08:26.004Z","0.10.16":"2020-05-04T03:30:58.174Z","0.10.17":"2020-06-25T10:32:53.126Z","0.10.18":"2020-07-15T08:52:16.873Z","0.10.19":"2020-07-17T05:34:13.655Z","0.10.20":"2020-11-23T08:16:43.605Z","0.10.21-beta.0":"2020-11-24T01:57:05.356Z","0.10.21-beta.1":"2020-11-24T02:03:56.022Z","0.10.21-beta.2":"2020-11-24T02:40:21.371Z","0.10.21":"2021-03-11T07:57:10.456Z","0.10.22":"2021-03-11T08:17:52.679Z","0.10.23":"2021-03-11T08:56:12.937Z","0.10.24":"2021-03-11T09:36:14.306Z","0.10.25":"2021-06-18T03:02:19.353Z","0.10.2-5.1":"2021-06-18T03:09:48.153Z","0.10.26":"2021-06-18T03:10:50.775Z","0.11.0":"2021-06-22T12:21:44.436Z","0.11.1":"2021-06-23T03:36:30.651Z","0.11.3":"2021-06-24T09:03:23.202Z","0.11.4":"2021-07-05T09:24:10.924Z","0.11.5":"2021-07-05T09:35:48.977Z","0.11.6":"2021-07-07T07:45:40.937Z","0.11.7":"2021-07-07T08:07:26.414Z","0.11.8":"2021-07-07T09:10:31.541Z","0.11.9":"2021-07-07T09:18:06.161Z","0.11.10":"2021-07-13T08:29:45.689Z","0.11.11":"2021-07-13T09:27:39.541Z","0.11.12":"2021-07-13T11:48:09.279Z","0.11.13":"2021-07-13T12:48:18.453Z","0.11.14":"2021-07-14T08:53:35.261Z","0.11.16":"2021-07-21T06:55:03.409Z","0.10.27":"2021-11-17T09:03:35.503Z","0.11.33":"2022-01-19T07:52:49.354Z","0.11.36":"2022-02-16T09:25:19.780Z"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist-tags":{"latest":"0.10.27","beta":"0.10.21-beta.2"},"description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","readme":"","versions":{"0.3.0":{"name":"tua","version":"0.3.0","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","optimist":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"latest","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest"},"devDependencies":{},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.3.0","_npmVersion":"5.0.3","_nodeVersion":"8.0.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-zH0CwFaaB8chVK9YEIEW5QIM3oiEjjNF4ci4q3EJFzfNuX964xhj3Kd82X6JamIeeQQUVUcS95aXGfC4ZNAMqw==","shasum":"f80361d1f96096cf28e28d023c171874ca29fe2a","tarball":"https://registry.npmjs.org/tua/-/tua-0.3.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICuuIaEzAwDAKozZHwUoZAfRRw9KYaiI30p5703iSVnJAiAMmIJQlUTtqqNnvILFe9wVur6NmN0ND81IbwAS8Q7q6w=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.3.0.tgz_1497336195693_0.46283708536066115"}},"0.3.1":{"name":"tua","version":"0.3.1","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","optimist":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"latest","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest"},"devDependencies":{},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.3.1","_npmVersion":"5.0.3","_nodeVersion":"8.0.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-m5qksE1hpO8+YnSLCm87HixZ5o8IVgNHkBgG7TAU6HuFmdZPAosby7GPFRS2EnFBbpOfWoEQOPO/LbJSev0LKA==","shasum":"83513bb2ac19a0ae5afc0bcea8585cda1db64e0e","tarball":"https://registry.npmjs.org/tua/-/tua-0.3.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAFq38yel1tLxRxjSp8uzYcchfBnBJgHkECy98HRq03VAiEA5/KuFbjSe8nPlArnOTwY3poQ6fll9Q7Qv7kuk7cN/mw="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.3.1.tgz_1497346744824_0.008360830834135413"}},"0.3.2":{"name":"tua","version":"0.3.2","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","optimist":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"latest","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest"},"devDependencies":{},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.3.2","_npmVersion":"5.0.3","_nodeVersion":"8.0.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-lABGtEnxGNDpJelQ4+PSgAaYOLLUL1XdvMgJkHPBspCxGecKnwdoEOuk9KxFO3vGdckEY1K8PU6lv+iQoCCFkw==","shasum":"3afdf15191b851b4cec39330e70f0df436b5d78e","tarball":"https://registry.npmjs.org/tua/-/tua-0.3.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEEvd1/+aL8Bmia9oFC+LuQLzIA2+O0EvIY1kqIm86oTAiBhYYCxwc13czwqvhony+AVgImGz7ZWIigy+gASR6Tadg=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.3.2.tgz_1497347287737_0.054828543681651354"}},"0.3.3":{"name":"tua","version":"0.3.3","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","optimist":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"latest","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.3.3","_npmVersion":"5.0.3","_nodeVersion":"8.0.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-VPiIpvCMwPPBUGLRkR8tdqmH+Z+S2oZEgVeKBg9yq3eJipCWiPgzzz0bKmNSnvkSrg45+z5FPjGmW+SKIVHe9Q==","shasum":"48b4624b8c08ff9013f98c83ae56097bef721f17","tarball":"https://registry.npmjs.org/tua/-/tua-0.3.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEX7BSEGpc5N7NZW5BlvLC/xeXIxkPxW3dPInmzHwykmAiBK/Z6sGJGIAwCxGqdqHixroqlhZLChKJnxojaL/cvnZQ=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.3.3.tgz_1497420308288_0.6930381578858942"}},"0.4.0":{"name":"tua","version":"0.4.0","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","optimist":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"latest","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.4.0","_npmVersion":"5.0.3","_nodeVersion":"8.0.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-82AFGMCUyDTbhJJuhySjSb/rWlDmOPXd0XsaekeeBwoZE6no72CKTC9bukG7R9VQXlFkdh5QpLQQYjl45R+dyw==","shasum":"1889736ea66420c8199a7a19a8e12fe67439fa0b","tarball":"https://registry.npmjs.org/tua/-/tua-0.4.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICJE+hG3Bj+b7k8cqtLwZFBbQFslOafDE1joX4HnBS8AAiBtnRZTP7f0jnFWDEDCqejqKSNLnXajyOOfumP9ziHm8A=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.4.0.tgz_1497429513849_0.9070146200247109"}},"0.4.1":{"name":"tua","version":"0.4.1","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","optimist":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"latest","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.4.1","_npmVersion":"5.0.3","_nodeVersion":"8.1.1","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-f4x0V7c7mdnT+06Vj7xdZY1Ht3YsycpEaQpmvVDTlHeBXDC/QiFOAyhQhLSicMU61/OlW1VJf5k1o1c/Jvf9Gg==","shasum":"9cbc5e71e6be4f0fb796eedc49bcc1bd97186da0","tarball":"https://registry.npmjs.org/tua/-/tua-0.4.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGAND3o4YwJtx9scKilsu+6cCiDDfp3LsY11jzB0FkQRAiEAi/ki0G4mvIlzisKTqnsVjbUsqlr84SHGgrVrBldmOQ0="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.4.1.tgz_1497583430589_0.40900940587744117"}},"0.4.2":{"name":"tua","version":"0.4.2","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","optimist":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"latest","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.4.2","_npmVersion":"5.0.3","_nodeVersion":"8.1.1","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-nDKxW6nbofGOc1q4Htham97qsc/tE7/rbeuK7ACZCtMLEkuTUbELbKFkHwvARbCeP0ialb6sYg3X6MGQ3FOCeg==","shasum":"462ffd46954b63e8638cad1eb16fddef0bbb7bee","tarball":"https://registry.npmjs.org/tua/-/tua-0.4.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDUxDw0fsrKWMw1ZdpWScZvRTX8AmXySN8fEU2I+4L7CAiAR9uGysLQEoHfS2LoYzEgolCnVt7/Jh9mKJDkRmbht5g=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.4.2.tgz_1497583913060_0.06361329625360668"}},"0.4.3":{"name":"tua","version":"0.4.3","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","optimist":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"latest","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.4.3","_npmVersion":"5.0.3","_nodeVersion":"8.1.1","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-YUJwFZ+Bia6TJC+t3z2rReefG6J9RdaG6hktubXO/a8ApW7KbK4EMHFPF62xLWzJin7M8esaik2yHdfwHFGwIw==","shasum":"45076a055deb9db2740d89fb2593e8f1d1c05064","tarball":"https://registry.npmjs.org/tua/-/tua-0.4.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID14MbPYtsWKtcR/0Da59oGocgIQbeyYa2r2B4a3gqYmAiEAybGlW0LKIxGQPd/L41rsdoYvBULq59PFff7g9N4Inbo="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.4.3.tgz_1497592828698_0.16716368007473648"}},"0.4.4":{"name":"tua","version":"0.4.4","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","optimist":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"latest","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.4.4","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-jjlPp/Ak+n4S9HF1VV2XB9zblrm0RT7bWfbHf1sAKjwTJy4FVjh3yup3hm3sisjfYb9yooz9tzzYwaJ5gwoeRA==","shasum":"9fa01e3ab0e51bff33edfef6f7be128ce8efac66","tarball":"https://registry.npmjs.org/tua/-/tua-0.4.4.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDEa2BJ9DVhLaSkEwfuxmljDp06bnk7sGYjwQu3zcGuaAIhAIiOHcIq7aEN9Y2/LaFrTm0StEXlPp3CNpsRtN00x2Ft"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.4.4.tgz_1497866740535_0.5106367361731827"}},"0.4.5":{"name":"tua","version":"0.4.5","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","optimist":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"latest","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.4.5","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-mbHW7WHnzv4TqW9NzPE08KMmPQzPST6k+Mtsl4YNaukxQKXJO/SvBGJZx/3d2SNrIj1tJmRDmKQ2Q+gTOc+LVA==","shasum":"0f7c18750e39a6491aa769ac58070a3b3a447465","tarball":"https://registry.npmjs.org/tua/-/tua-0.4.5.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHoRX+r3/jjM7p8hcH7H4a+bCzPTAKE/Y37IL6EU8f3jAiEAnPbHmkIB+v+Ke9v9g9yxcqB4B//hlHD83Q8FQC5m6gQ="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.4.5.tgz_1497876736024_0.701658833771944"}},"0.4.6":{"name":"tua","version":"0.4.6","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","optimist":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"latest","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.4.6","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-fm9QcqoQDSHGRQ60UAry1a7exklkUIGqyYsuncV7K7+zsiuyUJ3n2ejc5DYqGKUOWSKSJ6HqHkATTz9KaemN4A==","shasum":"7ac82fd1ed9de51d343c4725005b5ab968b06007","tarball":"https://registry.npmjs.org/tua/-/tua-0.4.6.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC9AZRZqkPRnRAKQspFNKjiYyKR8YIHdJQlYDlB6hUvWAiBeMZ7lOiyXg149Gf0fJsrg86UQiPJX/AP8HN5JCCgUqg=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.4.6.tgz_1497927038234_0.5320150929037482"}},"0.4.7":{"name":"tua","version":"0.4.7","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","optimist":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"latest","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.4.7","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-N2pu9yLSqTL+3Wvy2iMVQDqnKQiH2GUIYaMMY7GeR9/X1WzEY2FTnQs7t7kyq82EPx3z10SSy0/EWm6BjAHE/g==","shasum":"a16bf1d440615ed2c47ade29798670ff2e4626ea","tarball":"https://registry.npmjs.org/tua/-/tua-0.4.7.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBF9Sv7qVwmk6oD6YtsqHBBmw3Kc9Ak4ltWwznBr992UAiEA8nyauiWhQLq0UAE5Qrr38zRPA1m4s2y6zw7hOKgi7fo="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.4.7.tgz_1497939326751_0.45942244958132505"}},"0.5.0":{"name":"tua","version":"0.5.0","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"^2.6.1","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.0","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-7yIcjsR8tEqr09uZGmsmQ8hrkZF04CGavZXNaVgU+NcmebiJUf7ROE68gb3qd3czy9w9UjWOCoX4q0yUaLshBw==","shasum":"e3bd479b2fee2530178042335bcdf6eaedaffa20","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGW2OdFx5gy6NSAixSyWoxV8i46k+yAWWht7GJ9ZGlEEAiAGSYa4gE3D9H9YwaebpKPUvxgab289sgDVY+VnSW/itw=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.0.tgz_1497954641279_0.17303686193190515"}},"0.5.1":{"name":"tua","version":"0.5.1","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","ora":"latest","opn":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","url-loader":"latest","webpack":"^2.6.1","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.1","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-kaHMjbROHQYJhfrEE2EFt9JwMOMAP4h/tPWcmrRsgr4h+6Hr3f9QeCY74pZy0IkMevmX58345snIOvAx332XGA==","shasum":"14ff3f447566d0e299b452d946a6b95f91cc7b40","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0muiqGG4ULLnC+UztfE/5kJPqDRgQ7OJH1N74Wu97bwIgZvcLzRyhsi1VIbex27kBOLsXb6uZtlD6GCX0IPMltCk="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.1.tgz_1498013335334_0.8565505084116012"}},"0.5.2":{"name":"tua","version":"0.5.2","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"git://github.com/mishoo/UglifyJS2.git#harmony-v2.8.22","url-loader":"latest","webpack":"^3.0.0","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.2","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-JGNPMiGb3Ds5L6yKltlKn3BCj8/9iTFKD4GJ264g5pAvjXtNswxVs9u+jD9u0zfgTenBj++f5PREQQiazeZG2w==","shasum":"fc3c1cedeaa8d93a83e573322d4029e9828c88ef","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDRO88xsdS13oYKzexsxzT1U7RlBjXKDQc/5eFnk/1eFAIhAImdp0hAb/joRORc5o4BHUcmhFYJgG8NlAEixxfzf+MN"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.2.tgz_1498031564213_0.2248906244058162"}},"0.5.5":{"name":"tua","version":"0.5.5","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"git://github.com/mishoo/UglifyJS2.git#harmony-v2.8.22","url-loader":"latest","webpack":"^3.0.0","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.5","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-hokkl/A2iNidR6wkSIOY0C+vxiLrS7qvF0TukdjqeRthttp+jFUHekMjzZe1QysvGQEZ3qWrVHi90Js8VHOfrA==","shasum":"d916c45d21b75df1eeb266dfe9cefcb9018eda3c","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.5.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBjCOo9psDwVzgy9Lth/SHs09l4fA6sxQ8sINGuB1SKIAiEAqBaV/CoP/Dvh95kcvWYpXxETyX/gAUGOff5QjsKUqzU="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.5.tgz_1498119711806_0.7380662139039487"}},"0.5.6":{"name":"tua","version":"0.5.6","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^3.0.0","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"49ce79fe824cd5f2c52ffdcd88dd30f20a67ea5f","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.6","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-fpM4WiapMQlQndKUU4ii35W16PppBPU8CJBD0x9oGnKjpFuxaqPTJYyDXKN2PqPqVI7U02HD7/YTTWrrjC9vpQ==","shasum":"040853a4d8163cd1e909c7cbfb9454694b3e5c5a","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.6.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAnUxq341eHLfCMbL/PSl0vjj8DrvUvwzRltXcBMzS06AiEA0FVKEeCwqcty6QJLt7I94g2BKHw0SBjy+UUWTPrF89g="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.6.tgz_1498470363661_0.0034593618474900723"}},"0.5.7":{"name":"tua","version":"0.5.7","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^3.0.0","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib && npm shrinkwrap","publish":"npm run build && npm publish"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"4ff5f8ffb74cd8d10e1777e4003a1878fe90554d","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.7","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-nLKQZp7RqOo9Ow+xQ1UgdhEuyQgO+ojCwKOjSDq8o4HG3FL4Quu0FUSr+NVZfXI1iiQIwNEJcNT7SO6PYJKzAw==","shasum":"963e3f8a692d6c8140843990d9ca5346a050fd69","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.7.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBt36Da7C8wqHw0opQZSoB4BkUNkwWJU8NfI6oQ/4YNXAiEAlMyoTHzUnv3GQec9ScKhyGCsNyO9Gqp4y2g/Y9k67PM="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.7.tgz_1498473636767_0.483259187778458"}},"0.5.8":{"name":"tua","version":"0.5.8","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^3.0.0","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"3063c8e0950f661b222b42beb9c5a0811e3513c9","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.8","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-hOTdoFOZitAYbR4TD6Vi1Yn62y+imc5JzSIDYRU5hveJJCFkDKx38qNbKWsYbuYm0oBvexUVLMN76JBsCQzZ3Q==","shasum":"b8d546017f320efa037e07b3e6a8c9b4a89d6d6c","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.8.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBktaXLoGdEVhh0jcJRYtJqNL8jeX5PXuVQ1aPL2g4sLAiEAjfhSfpvX42dEKGmTQu5FlgQ8rE8KSNCOClPc/SS9cTk="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.8.tgz_1498475975192_0.2140695471316576"}},"0.5.9":{"name":"tua","version":"0.5.9","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"latest","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"latest","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-preset-env":"latest","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"latest","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"latest","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^2.6.1","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"8b049057cf98aa9927de108658f438937306defc","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.9","_npmVersion":"5.0.4","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-vk2YiyD39SgYmSka5PorfokhobfdGMBXnGNNeg84PKG6Drc1Dch7q5FnSGwBRJ+dVccp7WK9MZyEg+HPbvaUxQ==","shasum":"1831702645b6fcdbed715da510f37f5bd28ad4ec","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.9.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFnBDsuVt9aExVcj2PSrmObPI8kq470VwCSIx3hdSOXXAiA1FUg0Ht+9uGXM0JVUEdt83UJ9SB0i+4ms07rU1hogJw=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.9.tgz_1498646337103_0.05297981179319322"}},"0.5.10":{"name":"tua","version":"0.5.10","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"^2.0.0","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"^2.3.6","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^2.6.1","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"0be656a4a67aed4b0452aa87abf23212163b7904","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.10","_npmVersion":"5.0.4","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-GsdmUuavlXogRVZMqNNX/J+Q/3wocpz4Z6kGTFb/HZuS8qr9OlC9V1sMZy+y8ouNM3ps3+5Me5/GcG3x5cnxBg==","shasum":"a73c220a9004eb5c308873487a376366d29709fb","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.10.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB/awyQkmCOi4pBF+U+GafE54cCz0mGwjW02OX39D90SAiAbxtF39J2nPzvxf231j0Gtc6GqekDtpoGUxIcog8dqlQ=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.10.tgz_1499240020613_0.7113791194278747"}},"0.5.11":{"name":"tua","version":"0.5.11","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"^2.0.0","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"^2.3.6","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^2.6.1","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"d6b81d21247f70c9e753c75b2a43077b317aeb8f","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.11","_npmVersion":"5.0.4","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-ypozzCEx4N45sVvGZzjy6E4C2HPmou+2NDqjzEX+QZ6iYYtatorfUKRGTeReWnSdyhcJRcri522Qa5kJ7tzZmw==","shasum":"c7f7dd9bab81efebf1792824df03b8877439ac04","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.11.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFJeTvqLBZkr6oIV5fjG6igXmiKv58qyHo0LI9XDaHL/AiAUiWkAzeD+6XQFLRxuo6GppREmphXXmAF/Jvlbl+4Agg=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.11.tgz_1499241462369_0.35699419118463993"}},"0.5.12":{"name":"tua","version":"0.5.12","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"latest","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"latest","less":"latest","less-loader":"latest","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"latest","precss":"^2.0.0","prettier-webpack-plugin":"latest","sass-loader":"latest","shelljs":"latest","sinon":"^2.3.6","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^2.6.1","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"latest","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"ff0bf0c584fa0ff969c7aab4272ed58875dc768a","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.12","_npmVersion":"5.0.4","_nodeVersion":"8.1.2","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-1NUcSAjNhFD9Izt+jEVX7MKdeJhrSGOHxK5L4IT+v2bKtgW62LI8ZN1VOjvbERXN499qkuZRGGeAZNQHM+LefQ==","shasum":"c346be907427b76176d4a90833ddbfa630deea19","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.12.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC79FsuL2chSOCDrN1fB28A1X7h4IjTxrMcy1upMKMGaQIgaNOBsiLLbRogzV4rKOMsWAvrlPqpl5HonJPxpAciL80="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.12.tgz_1499250079987_0.7208443894051015"}},"0.5.14":{"name":"tua","version":"0.5.14","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"latest","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.3.6","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^2.6.1","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"^2.5.1","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"516920bd7f57070ccc31be56dfbd28adde521976","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.14","_npmVersion":"5.1.0","_nodeVersion":"8.1.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-q9PM1LZEsbpYrzacKfrHetBpKjqHdFLkBtt9VBUxhvABLMF6UI9CmR9WpAL3f+NTzVcYzNJ+VJ4zvcRUAQ9/7g==","shasum":"fb5c99c3c5b7fa5e1ef0870cf9b5a651260a3691","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.14.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC3mrWoYmoxc2nHatd+8WqYd/6kBVDSIq7rOHO8bc+9DgIhANwRe0Qf3TSwUX/WO77yZgiWu74I0hnX9YSlrVbRITY1"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.14.tgz_1499693184925_0.4233130025677383"}},"0.5.16":{"name":"tua","version":"0.5.16","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^2.1.2","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.3.6","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^2.6.1","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"^2.5.1","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"516920bd7f57070ccc31be56dfbd28adde521976","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.16","_npmVersion":"5.1.0","_nodeVersion":"8.1.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-IK4LSDrlj+SrzgyZvQZglNzG0JZ2VWU+o5ZlNmPHldnmZTo4feRYPNV148BKegWg6mcg2RV3mxDICveU8z5HoQ==","shasum":"84085e0d115989feb3ea93ed3c4a602bf567d026","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.16.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDpzv/V8H7H1h5TcQYUWp5ITABBmVtC51TlpQvRgNJS0AIhALYwfDn8j5eag5BY5R57I/lbkifcaXpLLKVte4kOJtJ4"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.16.tgz_1499750308873_0.7694660020060837"}},"0.5.19":{"name":"tua","version":"0.5.19","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^2.1.2","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.3.6","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^2.6.1","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"^2.5.1","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"496695165f9afc33247544c859d3e6bb60c8e69d","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.19","_npmVersion":"5.1.0","_nodeVersion":"8.1.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-4PRc7s8vbmRDVua8PleybHcHPRzyQRmahutEPqZf++rJyD04P8hkBs5UOka8orDcZtYVx8UbvmamgmHMjWA+kA==","shasum":"1bcb37d6b5ef605fce5a67eaad30ae0cddd3186c","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.19.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCj3XhAMVa3oLEnIy2KlumAER4R8vuhSdPBufVXyp2q/AIhAMwgkktPN6vIJuVgqO/91tgThtuCbZB7WHHY4DxpUN5L"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.19.tgz_1499775669828_0.5838417888153344"}},"0.5.21":{"name":"tua","version":"0.5.21","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^2.1.2","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.3.6","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^2.6.1","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"^2.5.1","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"90e077725d934d667d95dfa60b2c51f03bfd331f","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.21","_npmVersion":"5.1.0","_nodeVersion":"8.1.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-zpa4fuQvR1jnH6vHaKHmzJu8LlVBIFplI9jext0aKugn0/Zc/4Mb0O+J1lMGvkBsQGaFBKcIQ9Lv1qtKqR/TCg==","shasum":"8f8e65f4f0d85eb366dd48f9afffa708bf476920","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.21.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCv1IMaCWzduoWdxO7ohTBR5KMHsFoQ1uf5jONQuFw3JQIhAKjVWcc8+QTOQPv+qbrv5P5zmxJ+4wmxDi0IjdjvMlLi"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.21.tgz_1499832667033_0.5812437834683806"}},"0.5.22":{"name":"tua","version":"0.5.22","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","cache-loader":"latest","chai":"latest","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"latest","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^2.1.2","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"latest","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.3.6","sinon-chai":"latest","style-loader":"latest","thread-loader":"latest","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^2.6.1","webpack-bundle-analyzer":"latest","webpack-chunk-hash":"latest","webpack-dev-server":"^2.5.1","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"8edf63b8aa9f5dcde5761732e10665b6e5d87a07","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.22","_npmVersion":"5.3.0","_nodeVersion":"8.1.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-COQpLFGHb/yR4K6Gywsc/pzmlfvmUpx79d12DLWAAepjmJr5NavXJAMlCEdP8n7Pnp0BgU+g/0mFiO3Wv5Aumw==","shasum":"7846d034a4fd1fb784031a7e3ec4a742db515e09","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.22.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGrflTO23DfwR2x6O+sY72XzVuNW2cah8tXSCYZmHOt7AiEAqIRJoh52D+GJeEzCbyArG/NQUreBHZyAdcd/AsgwHXk="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.22.tgz_1500432061799_0.3863466549664736"}},"0.5.25":{"name":"tua","version":"0.5.25","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.0","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^2.1.2","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.3.8","sinon-chai":"^2.12.0","style-loader":"latest","thread-loader":"^1.1.0","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^2.6.1","webpack-bundle-analyzer":"^2.8.3","webpack-chunk-hash":"latest","webpack-dev-server":"^2.5.1","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"9041aaecf53b53f300c3dc165b67cc0a796e0088","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.25","_npmVersion":"5.3.0","_nodeVersion":"8.1.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-bQ/8s25HgoKX7Pkv22IbmunWKfWmAUuX4bMo4lsB0bs2iNjVI0BYstfEP3lYRr2eEcBp93CVu8OHhddAQlvRRQ==","shasum":"751e8192185563449b6bd786b1d18b701209a5bb","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.25.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDajo7bJCjnOnmMbYOjkqsOlweE7LPWRgRVuX3kZKu6HwIhANw8c/mnkgPC969CAlyiqvk8PLBDq9bN3YT04YgkggOO"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.25.tgz_1500450963092_0.11678869230672717"}},"0.5.27":{"name":"tua","version":"0.5.27","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.0","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^2.1.2","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.3.8","sinon-chai":"^2.12.0","style-loader":"latest","thread-loader":"^1.1.0","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^2.7.0","webpack-bundle-analyzer":"^2.8.3","webpack-chunk-hash":"latest","webpack-dev-server":"^2.5.1","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"afc420a0493c25a3c319a202bc3ad03a7be3ba70","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.27","_npmVersion":"5.3.0","_nodeVersion":"8.1.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-cuhh5ZO5x9/uV7p+mzruuLz/DmdPzgANXOpob58h00otkChdSjWyMMiUq1PFpbv72Eh/xPla9mAVVQUrItgWrA==","shasum":"959b8f565665ddb358afabd42b90505045fe0fe1","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.27.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCrKVv0oT4zjqaM7RY9LjCiPVCQETtg3N7vUpOgf3I7hwIhAMCh4DsE7I87xQlu+rpWsweKdRifEVuF81LUP34ktrH1"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.27.tgz_1500543245461_0.032038378063589334"}},"0.5.28":{"name":"tua","version":"0.5.28","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.0","chunk-manifest-webpack-plugin":"latest","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^2.1.2","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.3.8","sinon-chai":"^2.12.0","style-loader":"latest","thread-loader":"^1.1.0","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^2.7.0","webpack-bundle-analyzer":"^2.8.3","webpack-chunk-hash":"latest","webpack-dev-server":"^2.5.1","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"cf6dda0ec3f130aa0b6f8265b71e94ff11a5f8bf","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.28","_npmVersion":"5.3.0","_nodeVersion":"8.1.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-TOCjJRYsxomsP+L9jsq4cgRg52PDyK0xDAilv7mgJe3Wgj1G2DIDNcdhumdaXjTdJiyB15pZqaU73h9PPSw49Q==","shasum":"d1a4188a82749593c05e5b53e9a4c42536b04586","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.28.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD3+TiLiHdAHvj1giywauRP5zGB3CVDS3BY9o09YN/2MQIhANdcNmWpcNhKBM6oTDUEi5SNZmqNgP2fV+lhPTwEc/lc"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.28.tgz_1500862896407_0.9754031570628285"}},"0.5.29":{"name":"tua","version":"0.5.29","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.0","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^2.1.2","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.3.8","sinon-chai":"^2.12.0","style-loader":"latest","thread-loader":"^1.1.0","uglify-js":"^2.8.29","url-loader":"latest","webpack":"^2.7.0","webpack-bundle-analyzer":"^2.8.3","webpack-chunk-hash":"latest","webpack-dev-server":"^2.5.1","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"3f84b8766af7e2b0e5cd086ca2f5d37a23f52eba","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.5.29","_npmVersion":"5.3.0","_nodeVersion":"8.1.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-N3cC+fgLtTGHkFuC39aUpFh2TzSgwBR/gXBPZ8FIT5brcvNaqAboQZBxawTt+WkE+TOx5UJLU0VrxZD5EAUmSA==","shasum":"a93d3d98f73cc183c8fd9d3fc33eb9a1f288f8b7","tarball":"https://registry.npmjs.org/tua/-/tua-0.5.29.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBqmcEi8lulqYIUWPLcxpafbRTrxcL1netmIK+S/jHUmAiEAwob5LbOYXwMma2aeiR4EImxPBDPjxH1o6GHa/6HtmME="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.5.29.tgz_1501061903114_0.29778854781761765"}},"0.6.1":{"name":"tua","version":"0.6.1","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.0","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.0","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.3.8","sinon-chai":"^2.12.0","style-loader":"latest","thread-loader":"^1.1.0","uglify-js":"^3.0.6","url-loader":"latest","webpack":"^3.4.1","webpack-bundle-analyzer":"^2.8.3","webpack-chunk-hash":"latest","webpack-dev-server":"^2.5.1","webpack-merge":"latest","yargs":"latest"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"20dd8d10878802dba66b5c2efd2aef547adca98b","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.6.1","_npmVersion":"5.3.0","_nodeVersion":"8.1.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-ZySG7i1Q+cnGxubANDK61d2/qZy+N3wYdknT9yb/pRgUdlKMYVaTL0/HCi9dB1+MS6WQ7l/rHkjCVCYg4AKboQ==","shasum":"49f469a454f6c8ea9b5539291e0d57ff9cb52251","tarball":"https://registry.npmjs.org/tua/-/tua-0.6.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDxYhNFiN6vu4Mt9H2osfeaHE1zSV+2aAdIBxgFLz269AIhAMDIbmDT2vctSQeYe3Ho5l6i7ulG+EBRcFYUE1tGhh9U"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.6.1.tgz_1501065129776_0.9556654789485037"}},"0.6.2":{"name":"tua","version":"0.6.2","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.0","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.0","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.12.0","style-loader":"latest","thread-loader":"^1.1.0","uglify-js":"^3.0.27","url-loader":"latest","webpack":"^3.4.1","webpack-bundle-analyzer":"^2.8.3","webpack-dev-server":"^2.6.1","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"d271ee4582f276fcee547be770f87835fd1759a6","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.6.2","_npmVersion":"5.3.0","_nodeVersion":"8.1.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-8a7hwaETPxPyKNZZ2VAeltFZ/zVVLAG4hYpq7FdFl8U3lSqVOyz7ob2OAu4IZdIomsOS95gZ21XwXtqGvcBPHQ==","shasum":"290f8c1f661a2e81ff33cfecffcadd738a6f08f8","tarball":"https://registry.npmjs.org/tua/-/tua-0.6.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDAEwSiad+ijVqRGuZD0WIhwb/w+4PJJii4gVix1dkzxgIhAOFZXbvuRSy4rm7lhFRwNSrdtRtOQbc1c3cH/nKzfEGM"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.6.2.tgz_1501474603438_0.40470785018987954"}},"0.6.3":{"name":"tua","version":"0.6.3","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.0","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.0","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.12.0","style-loader":"latest","thread-loader":"^1.1.0","uglify-js":"^3.0.27","url-loader":"latest","webpack":"^3.4.1","webpack-bundle-analyzer":"^2.8.3","webpack-dev-server":"^2.6.1","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"d271ee4582f276fcee547be770f87835fd1759a6","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.6.3","_npmVersion":"5.3.0","_nodeVersion":"8.1.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-Nhn5YeOSW4i/Mk08yDrQHtiX4V5XBcLB27cn/rVRJrvZ0k1mSnHw5AVRQHI9wu87zsYpDBARQtV8Nf5O0bqOtg==","shasum":"4328c69e9809c18a25e16343ff22e751d00baf05","tarball":"https://registry.npmjs.org/tua/-/tua-0.6.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEka7f1cUY1QQXtGHaQHKvAqoR4QkjFh0xZ3B810w9iTAiA5GZlQZEIJtlcPJfeNBfbNjYYakQENh/rkJ5bpDriM2w=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.6.3.tgz_1501474626587_0.5672514119651169"}},"0.6.7":{"name":"tua","version":"0.6.7","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.0","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.0","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.12.0","style-loader":"latest","thread-loader":"^1.1.0","uglify-js":"^3.0.27","url-loader":"latest","webpack":"^3.4.1","webpack-bundle-analyzer":"^2.8.3","webpack-dev-server":"^2.6.1","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"8ab2a7fad1ece18530e0dd2c79d3757d61856d51","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.6.7","_npmVersion":"5.3.0","_nodeVersion":"8.2.1","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-j8BspcaCiYj82S6e5gut0mLexp+10Bb6UvHCFsLyxkDhoy068XnyjeRW59kPEB2eDBDE+426VPr5EK/T8Nj6zw==","shasum":"0b9cb6489d94ad20ba1a2b8ec031c9f79a51ea49","tarball":"https://registry.npmjs.org/tua/-/tua-0.6.7.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDRL+nRuzOHtTNmHRFYWFfNTecuulH1A9IJ/rl58lSRVAIhALLACNNYLtugGV49DqgZGhSK9oWNjQ5LsUMOOjqyXs+5"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.6.7.tgz_1501747983951_0.42342011723667383"}},"0.7.0":{"name":"tua","version":"0.7.0","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.0","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.0","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.12.0","style-loader":"latest","thread-loader":"^1.1.0","uglify-js":"^3.0.27","url-loader":"latest","webpack":"^3.4.1","webpack-bundle-analyzer":"^2.8.3","webpack-dev-server":"^2.6.1","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"4d3a6d33d3c3b77cf007c994c65a5e7557dbd014","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.7.0","_npmVersion":"5.3.0","_nodeVersion":"8.2.1","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-qBQekGaCxE15a8vo3cQ6vxlCjPA6U3QtBxWFjwECa3e+uRfyxpOBa5EXBewimQXF5FqRMF0EFSWk94iUE1GMlA==","shasum":"f6074be81cf84b8e5bcdddf981e86c64155d0807","tarball":"https://registry.npmjs.org/tua/-/tua-0.7.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE1XA8CYRDyrhc4qaB8molKD0hP0DUORMVYSVVmOW5h0AiEAwY8YfpLGths7V9Dr9Fb9AQ/HWR4WuFvw/ibwqLvCzlI="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.7.0.tgz_1502271437344_0.3542604437097907"}},"0.7.1":{"name":"tua","version":"0.7.1","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.0","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.0","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.12.0","style-loader":"latest","thread-loader":"^1.1.0","uglify-js":"^3.0.27","url-loader":"latest","webpack":"^3.4.1","webpack-bundle-analyzer":"^2.8.3","webpack-dev-server":"^2.6.1","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"284f800b32e6a462655904b480419517e9e74dcc","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.7.1","_npmVersion":"5.3.0","_nodeVersion":"8.2.1","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-/s7eYlRP4+kRtGOVEfooqpophj76NCVyagW1GZTLXuW37/ZKbif0E2Fatw8ah+gJEROVw7kPwzH64Rulgwu56g==","shasum":"fffe47e11feca90e43707fcbb94571ed1a78c1a6","tarball":"https://registry.npmjs.org/tua/-/tua-0.7.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFQYDRzKhDK4tHBAc+kTyLK8aVLhSqhXI8so/tAevZb5AiBQGq2auQPMrPMKjlO9ywgYv3NKGCr+nRlCQwRBgIkr4g=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.7.1.tgz_1502272508317_0.9462197308894247"}},"0.7.2":{"name":"tua","version":"0.7.2","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.2","babel-core":"^6.25.0","babel-loader":"latest","babel-plugin-minify-dead-code-elimination":"latest","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.23.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.0","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"latest","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.0","file-loader":"latest","html-webpack-plugin":"latest","http-server":"latest","img-loader":"latest","karma":"latest","karma-babel-preprocessor":"latest","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"latest","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","less":"latest","less-loader":"^4.0.5","mocha":"latest","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.1","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.12.0","style-loader":"latest","thread-loader":"^1.1.0","uglify-js":"^3.0.27","url-loader":"latest","webpack":"^3.4.1","webpack-bundle-analyzer":"^2.8.3","webpack-dev-server":"^2.6.1","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"latest"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"48777ee4216ee1c722be0bf0dbd661ea09bd3292","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.7.2","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-HZKjE9X4CksLs7qaCHiePsS+P0ggHPY/VSUVvQszS2mawKPaeBWWj8mZDzC2AlkiK5kyBi3c51Fz3SD5ljQSEg==","shasum":"a3c04e165378fd00fcfe7db50890d5527847c6b4","tarball":"https://registry.npmjs.org/tua/-/tua-0.7.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID4em90YhIl4vX+LMj1e3zAzpcwXhHnAqPHEF5EWGbyeAiEA8qAHMffOxDhbkXHx4l6Tb23Jzq1Mv2z904pMrZK/Tu4="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.7.2.tgz_1505373572160_0.03661145665682852"}},"0.7.3":{"name":"tua","version":"0.7.3","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.4","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.0","file-loader":"latest","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.4","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","koa":"^2.3.0","koa-webpack":"^1.0.0","less":"latest","less-loader":"^4.0.5","mocha":"^3.5.3","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.13.0","style-loader":"latest","thread-loader":"^1.1.1","uglify-js":"^3.1.1","url-loader":"latest","webpack":"^3.6.0","webpack-bundle-analyzer":"^2.9.0","webpack-dev-server":"^2.8.2","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"b93822040fad721e40d327799203cb5052d2e8ff","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.7.3","_npmVersion":"5.3.0","_nodeVersion":"8.5.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-fDZB/R6pYwZ7GfejgbCm1XCn4MQHx4QmUaBMsx8aGwfTUYEwxt0vGuld5iNQ8xDlpBUECTRrQ+EQPg4JC05CRA==","shasum":"431bb6c93ca0d300167cf96de7127e3a89e653ab","tarball":"https://registry.npmjs.org/tua/-/tua-0.7.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHyKc80ekhxZU9BIJ6xD5c4vOKOw6La/BzCZWhvGc2jRAiBrV1sdHXThVUCqcReUGyANucWYbJAnBc/LCmvUpRxnvw=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.7.3.tgz_1505817910980_0.617065008264035"}},"0.7.4":{"name":"tua","version":"0.7.4","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.4","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.0","file-loader":"latest","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.4","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","koa":"^2.3.0","koa-webpack":"^1.0.0","less":"latest","less-loader":"^4.0.5","mocha":"^3.5.3","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.13.0","style-loader":"latest","thread-loader":"^1.1.1","uglify-js":"^3.1.1","url-loader":"latest","webpack":"^3.6.0","webpack-bundle-analyzer":"^2.9.0","webpack-dev-server":"^2.8.2","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"16d22c11c27bf21ad9df6c6b02404ad3aa816364","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.7.4","_npmVersion":"5.4.2","_nodeVersion":"8.5.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-WQztDRms62cuOJYXufb0XjUH70UEbB+lhbiWlQvioSz29dNKHESLzwOjdQdKNXZbLueoJ86qzlRWbf/KcMcFXA==","shasum":"7246b0ec7881b6bd3cf708eeb1ea98f56d5a36cb","tarball":"https://registry.npmjs.org/tua/-/tua-0.7.4.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD6TC7oMz5u+uYlQ/QU9euJH0al9FPsfC2fLSjVQDEKFQIhAPBArKqI0eHYQwkhryXSkz1DWlrxb/ahd4WT0AJB76Bk"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.7.4.tgz_1506416737460_0.8983105400111526"}},"0.8.0":{"name":"tua","version":"0.8.0","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.4","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"latest","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.5","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.0","file-loader":"latest","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.4","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.4","koa":"^2.3.0","koa-connect":"^2.0.0","koa-router":"^7.2.1","koa-static":"^4.0.1","less":"latest","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^3.5.3","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"latest","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.13.0","style-loader":"latest","thread-loader":"^1.1.1","uglify-js":"^3.1.1","url-loader":"latest","webpack":"^3.6.0","webpack-bundle-analyzer":"^2.9.0","webpack-dev-server":"^2.8.2","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"cce6392ee46b0a2d29e9392ffe82e356ce9d9c99","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.0","_npmVersion":"5.4.2","_nodeVersion":"8.5.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-Gkvehc7x+Aa/QRr/79VpNyKaDzlggoZe0xl8HxgaRF4Yv4tbcNDPagO5HTSEbseluiXCvkOw0DYaQE94ODHEzA==","shasum":"a49c3f8a76040b29606f2d0b24eb388ce0f7463f","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAvYMrV2/mF/HOstQSFAFW2Cjnm7ifayegVLh8RqNBbRAiEAqPvASmBvMx08ZxSL7nD6x33cVfP+mUMCESuovmX3uQU="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.0.tgz_1508322261074_0.9156350411940366"}},"0.8.1":{"name":"tua","version":"0.8.1","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.5","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.1","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.5","koa":"^2.3.0","koa-connect":"^2.0.0","koa-router":"^7.2.1","koa-static":"^4.0.1","less":"^3.0.0-alpha.3","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.4","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.0","webpack-dev-server":"^2.9.2","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"b4e7fe49fefb9caf2a1d777f67d40981dc8f9a5d","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.1","_npmVersion":"5.4.2","_nodeVersion":"8.5.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-6R3o3ys+hB19ysMbHgMUo9kGoN0CGof6HK/bzs0FsW9AobyU0FTZDsc41XBjTGgKEgHjXZ6d9fxKRmMfjtfp8A==","shasum":"50d5ace7dd7bfa8420ccbbfee50bfe5d074dd5f5","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCZHxOnJC+GOIXnXUAE43sUxaBdkCh/KoSK1tlIHoQulQIgbrJ+Q/dqFRe5517NZP+vBJIIGvGGcoPdXqlLO2J2Qkg="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.1.tgz_1508396527031_0.48196129337884486"}},"0.8.2":{"name":"tua","version":"0.8.2","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.5","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.1","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.5","koa":"^2.3.0","koa-connect":"^2.0.0","koa-router":"^7.2.1","koa-static":"^4.0.1","less":"^3.0.0-alpha.3","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.4","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.0","webpack-dev-server":"^2.9.2","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"406ad8aca07c1a4134f73df8c36f4f721dd5247d","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.2","_npmVersion":"5.4.2","_nodeVersion":"8.5.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-n+qYSTgkz9X6ioRJ+m3AK6I5jhz7ZmFpDTx6O0D1VVTMm9k19vXewFefpmROL0GGmF+mxy3xUAKoN5M5M7vxhg==","shasum":"52a72527c6987465e4f6b1ce5c4b86c5896356d1","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCpFJt6IsfQEcIeWrpZcnrpzxHRJyrzsFoaoe7Ajt3YEwIhAPayy2GoYbzaCAqsbLHAIU/vmipXU6ezUl5Sc1avFKiY"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.2.tgz_1508468593603_0.24646766763180494"}},"0.8.6":{"name":"tua","version":"0.8.6","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.5","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.1","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.5","koa":"^2.3.0","koa-connect":"^2.0.0","koa-router":"^7.2.1","koa-static":"^4.0.1","less":"^3.0.0-alpha.3","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.4","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.0","webpack-dev-server":"^2.9.2","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"71fc3e8b390be6cced01d9cc6aa6f50d6f5f8559","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.6","_npmVersion":"5.4.2","_nodeVersion":"8.7.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-pljgDsmA0Ph9Rj83le3D2lqpVlI3T92HbB80EWvC7hYyx3Yawg9hXQEQFolwXpQcMZbhhg2OnxRFPmjg85pn+Q==","shasum":"e360c6ee796978f0d2a57e06be66e79d78cefd1a","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.6.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCcXot7NT4MtisOjKDzAS5KUNWgdLLWjnWgn188JsAgGwIgbz51gGrqmEMYZjuB1Qxblagfzfhelh2CSmNK3uVpBt0="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.6.tgz_1508833492007_0.26501882541924715"}},"0.8.7":{"name":"tua","version":"0.8.7","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.5","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.1","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.5","koa":"^2.3.0","koa-connect":"^2.0.0","koa-router":"^7.2.1","koa-static":"^4.0.1","less":"^3.0.0-alpha.3","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.4","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.0","webpack-dev-server":"^2.9.2","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"5ec3f02dea9559cb790d152a8b15a51b41ab5dbb","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.7","_npmVersion":"5.4.2","_nodeVersion":"8.7.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-fSEmEG549cCKGY5SRg4lAjjjWcEQHodz9Vgn4MwnidfxznivJ+cUMFxsrFHf6vtJagQqW8PizhCPhC9IHL6FKg==","shasum":"ea0c4e5c0132ce540d77be950a7692af8bee8cd0","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.7.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGTZMSNrFWgOT7crEW179f/y2PA7N9Nv/DjBsVK3BbvTAiEAignKWwmdk8Lu12UC+MWl4f6GPExSaXvw3Vz+GM53+Nw="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.7.tgz_1508842065791_0.18232127744704485"}},"0.8.8":{"name":"tua","version":"0.8.8","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.5","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.1","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.5","koa":"^2.3.0","koa-connect":"^2.0.0","koa-router":"^7.2.1","koa-static":"^4.0.1","less":"^3.0.0-alpha.3","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.4","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.0","webpack-dev-middleware":"^1.12.0","webpack-dev-server":"^2.9.2","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"5ec3f02dea9559cb790d152a8b15a51b41ab5dbb","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.8","_npmVersion":"5.4.2","_nodeVersion":"8.7.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-CpShREtNJs3gnICioZq8VnyLJZYOZ5D/8fFkMTyGw0Ko1xyvj22u8plAJfFwARvOt7FkE178RZXMlyWfvlldyg==","shasum":"0211b700aaaf4dab1b5116e7f4581a71e2ca05ed","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.8.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFrhHAP2UTB/h0YuXBlCREl6uZTO6uK5N/axhiB9kMAuAiEAuyRD3MDkNn/AgFupQDtfigpf2/KsA1uT4QmsgXXE3Xg="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.8.tgz_1508902111807_0.23818372935056686"}},"0.8.9":{"name":"tua","version":"0.8.9","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.5","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","extract-text-webpack-plugin":"^3.0.1","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.5","koa":"^2.3.0","koa-connect":"^2.0.0","koa-router":"^7.2.1","koa-static":"^4.0.1","less":"^3.0.0-alpha.3","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.4","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.0","webpack-dev-middleware":"^1.12.0","webpack-dev-server":"^2.9.2","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"0ea1006ee94003fe6c8fcc3e40fa875c4239ef27","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.9","_npmVersion":"5.4.2","_nodeVersion":"8.7.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-MpalvyoiKfP9+ZAMRMZSVc+nc40S1VYtms3SjrncAV37QLiVBF+mu/9uDx+Jr1q6EwwMIzC60h8fjgiKURL3Og==","shasum":"8b50f629e0d1273958c5d5b16490bdae3ef1acf9","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.9.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDrFUF2n3eFr68xfiv0vZveJCKJ4ibQ8LxcYAsW1fm9bgIhAPge1zAogQtAESTkAXt+p6ol1wrpD/joQhKCqMbfJoNJ"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.9.tgz_1508985703071_0.15559357800520957"}},"0.8.10":{"name":"tua","version":"0.8.10","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.5","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","consoleplusplus":"latest","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.1","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.5","koa":"^2.3.0","koa-connect":"^2.0.0","koa-router":"^7.2.1","koa-static":"^4.0.1","less":"^3.0.0-alpha.3","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.4","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.0","webpack-dev-middleware":"^1.12.0","webpack-dev-server":"^2.9.2","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"9b2e138a24a0778752c401eba6601bb72344e7b2","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.10","_npmVersion":"5.4.2","_nodeVersion":"8.7.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-VYikp7GIKBsF4EuKyG3UQdGZbBkrjqBgyBI22foKMBPj8E+y+D/nM/7WuGBy8fsespBprRur26ZsIyu1I8Z7kQ==","shasum":"c0d02e595902f03d34657ea6023d5bcefe8fbb45","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.10.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHGQj8TXsjEKRVtsbJPk6u1zFejscf9Rc7SGI6ddqEgnAiBG52dUAdiy3Ji1xGSKRdXmx231VMgupcZBfi2vIJXZ8g=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.10.tgz_1509350859207_0.495722129708156"}},"0.8.12":{"name":"tua","version":"0.8.12","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.5","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.1","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.5","koa":"^2.3.0","koa-connect":"^2.0.0","koa-router":"^7.2.1","koa-static":"^4.0.1","less":"^3.0.0-alpha.3","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.4","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.0","webpack-dev-middleware":"^1.12.0","webpack-dev-server":"^2.9.2","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"4e9576d26f87641bed3c0457d6260af3affe56d3","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.12","_npmVersion":"5.4.2","_nodeVersion":"8.7.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-clq1jZAkn3ZSyp5gn3I27Q/XBWO6IWn9cZhHcsrlZqkKsA+QAMVb0H5z4+3OcQDJAGKTpfC1HteoXIpIEZ1Gpw==","shasum":"e027cb9273ded19f57bf03bace1bc012f8831b11","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.12.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBMGtu/pbDZJoyOQGEcT6wmL5Tv7j1kCdK7UyCkNum7aAiEA9iQCXyRxf+FhIY+I5UOc5HHaIduLMFti10NiY7lQNAg="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.12.tgz_1509355463790_0.37568154628388584"}},"0.8.13":{"name":"tua","version":"0.8.13","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.6","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.5","koa":"^2.3.0","koa-connect":"^2.0.0","koa-router":"^7.2.1","koa-static":"^4.0.1","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.6","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.0","webpack-dev-middleware":"^1.12.0","webpack-dev-server":"^2.9.3","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"dff2d07a5ceb5550e88ba80e4578f1e3d2321cb2","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.13","_npmVersion":"5.5.1","_nodeVersion":"8.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-lix0qpFipjlu6+kRe0q7v+MnQXhMAavdMmJEgT6RUkHTqnCSqis1STnPNRyndHErfWqscdB83wdEVj0OojxRew==","shasum":"041ff42eb8684dcce250ccebb6e4d4a51f8025de","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.13.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCBaqEvSPVmufORnG8h7lJvidvO6GQXb80SCQqOBKr5LgIhAPKRaz+bs9uD3jBIHZfFYMJYNbNlI1NTIiiiP/ZF5vPW"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.13.tgz_1509525591817_0.9085124148987234"}},"0.8.14":{"name":"tua","version":"0.8.14","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.6","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","bundle-buddy-webpack-plugin":"^0.2.1","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.5","koa":"^2.3.0","koa-connect":"^2.0.0","koa-router":"^7.2.1","koa-static":"^4.0.1","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.6","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.0","webpack-dev-middleware":"^1.12.0","webpack-dev-server":"^2.9.3","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"4a0c559bfbe79a5fc46070f55ca36e904f31d7f5","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.14","_npmVersion":"5.5.1","_nodeVersion":"8.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-+cQTO8Dk6wij7RkIDFMmZp0KTevJjncquWOsePqN96CSwIGJI/p1zbSiZbla4E8FG+CyoaN+bZnMjQD+rCubpQ==","shasum":"a1380cd348be4a55450a5c70e1934ebd8781f4d8","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.14.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH9qn/kTqKH8QO0EA2lAaZIoSMIB5kVjniDQJWLSjVxJAiEAw6DYOGGqXkDde+55RiheJWWQiMumTeQAgyUiAn1sYB0="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.14.tgz_1509677765849_0.23229155968874693"}},"0.8.16":{"name":"tua","version":"0.8.16","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.6","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.5","koa":"^2.3.0","koa-connect":"^2.0.0","koa-router":"^7.2.1","koa-static":"^4.0.1","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.6","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.0","webpack-dev-middleware":"^1.12.0","webpack-dev-server":"^2.9.3","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"1cd4225edde7b78a90af688b2c50572f9400450a","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.16","_npmVersion":"5.5.1","_nodeVersion":"8.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-wtGgzlGpcBk8Me5QX3sGHO0dGdG2PzUL/oAiJedKpI8dIBP82TsyUdzbcVn33gFT102nWpYCznNX8Ylf5OtUDA==","shasum":"972b8ea57f65e80af81328f469b8b544bb3c5b36","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.16.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBSxBmuZH4f3ov/XDvGg8T5m9j7SXpWvzkRM8wXD37G7AiA5E1GqZofTGIxmBUolQUd2N2dsDYubox63VnGg+KMBGQ=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.16.tgz_1510131593868_0.592876457143575"}},"0.8.17":{"name":"tua","version":"0.8.17","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.6","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.5","koa":"^2.3.0","koa-connect":"^2.0.0","koa-router":"^7.2.1","koa-static":"^4.0.1","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"latest","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.6","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.0","webpack-dev-middleware":"^1.12.0","webpack-dev-server":"^2.9.3","webpack-merge":"latest","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"2fd8fb36f6cd7c50c56f3ad7c9fa22769157fe2e","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.17","_npmVersion":"5.5.1","_nodeVersion":"8.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-Pva4ESjSILJny0PP1W5mwA1K/27qcjGFOVExCquNOyA38fR4ZSAJ5/nyJGbTYW58VIqzmN/BjayJIVEx/2lwCg==","shasum":"14b03003e30445df178d3aa07ca3e1e6f4bd0695","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.17.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF89AZCQEk/WJx8Zi4XJ6lkBDG/S4L/1JZXmd25YR/qQAiBVtAglqSIubCTEBNe8V8q8MBzfcuhAWUFJerSCCJ7FsA=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.17.tgz_1510741518844_0.5461960744578391"}},"0.8.18":{"name":"tua","version":"0.8.18","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.6","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.6","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.1","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.6.1","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.9","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.0","webpack-dev-server":"^2.9.4","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"295ca7d4e9eb93ac993a64bb1f6130dd859d77d4","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.18","_npmVersion":"5.5.1","_nodeVersion":"8.9.1","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-cIIUQz1WHRANaq9T2BYuK7nIqHD3q8/3m4Ro8l722XAuwjbUn/LnJ0qhQ+4n3VQTHv+VBDG90i8JDybnUcxSFw==","shasum":"18f344436ef5200087e2199225eda7695e0ed216","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.18.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAnr0JOAprmGy64cKZRSU4JDDkM/WDjMK2k4laYX3dq4AiAGUTSkPaD8pjdYMktGCZc01DxC5gticLBntDsSgSLw+w=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.18.tgz_1510801198524_0.8522588047198951"}},"0.8.19":{"name":"tua","version":"0.8.19","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.6","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.6","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.1","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.6.1","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.9","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.0","webpack-dev-server":"^2.9.4","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"14c786f32fa74afc7502ccb82e66bb380fdbc1a8","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.19","_npmVersion":"5.5.1","_nodeVersion":"8.9.1","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-PzRqQdvm4HQjK0XIQS+o89BxmFcInNRFYQfp7oeTiltnyaC4wsXb2CJWy8FTuJHTro8nMdt9lhCEZ89mdQW0lQ==","shasum":"7a5a7cab9c5858f2ebf5467eae3b60ac44c44e86","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.19.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDCON+Fn4C+8RK4vnqcGG0j3dnHm3vXPwgUo8qWfJGeAwIgLKGLAkv4hMaM7uMs42w+ab1tyV/ahzPcPG8eXm968dE="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.19.tgz_1511166485215_0.7190049232449383"}},"0.8.20":{"name":"tua","version":"0.8.20","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.1.6","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.1.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"latest","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.5","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.6","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.1","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.6.1","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.8","postcss-smart-import":"^0.7.5","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.0","thread-loader":"^1.1.2","uglify-js":"^3.1.9","url-loader":"^0.6.2","webpack":"^3.8.1","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.0","webpack-dev-server":"^2.9.4","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"c705e7b22aae9acf695090c68ec29e3865c3c1ad","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.20","_npmVersion":"5.5.1","_nodeVersion":"8.9.1","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-XpNMI705DoWeevjMwTNSZd2gPEuJrXSa2na7NK+3GIgCgM0Rqzln+fPbfA+9fpeAlYl/TYMd2g/0urWHkkw75w==","shasum":"d84354194746bbcf917e37db61a35ac029766143","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.20.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJHeuWeVUNNPx1LRWxwjG3fUUKZWBfUwboTRPLQ5J/3gIgfF1rPVW9ri+t21txY7anPVzVwH8pOy2nt/Dq3S4wKec="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.20.tgz_1511427448497_0.8398860252927989"}},"0.8.22":{"name":"tua","version":"0.8.22","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"1edf1042c15d77d08cf6b303d0ba936b90aa8770","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.22","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-S20Y9GfsRcMitIw77dY7V3Fzh4Qgm55RReyi1T44DxVDIqr/h9m1PBLfXQ1/r/ozwGAO2iklcXvoVEby9VudUA==","shasum":"cd0fb2e0581adfb7fda8372658de35e58e248d2f","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.22.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDdZccBG3wLIdmpy/S7wnvPs/A0wBiPyqqr2TxIlJxNQgIhAN5PFdphMq45ZERp+nnGXFc7QMRHTpMq9Zq5nmsj5gcx"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua-0.8.22.tgz_1515466196800_0.7955311492551118"}},"0.8.23":{"name":"tua","version":"0.8.23","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","source-map-support":"^0.5.3","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"f9721a0d27368d7c7486ca39a0d3b147d610eb83","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.23","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-H5N5Sn1eGDutihoLMIKpWdqyoosNbYF3otOotmLUHVjSfKHl4xwA4UhZ5GWUWA3WH/iCGrKDuL7cdAHWxZwAUg==","shasum":"06c4e5c1da0fd220d8572874b37eb09b162f45d8","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.23.tgz","fileCount":51,"unpackedSize":217872,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBwRBjWJoZWIdoRbDZXkJWagVLfNPwfIqUPtmfrOiAXqAiEAtkXpi8Mmv4JhY6+IGt9yzxsutgMlgdodBzlmp5Mj0Bk="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.23_1521110261737_0.8119160337597917"},"_hasShrinkwrap":false},"0.8.24":{"name":"tua","version":"0.8.24","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","source-map-support":"^0.5.3","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"f9721a0d27368d7c7486ca39a0d3b147d610eb83","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.24","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-3T2aedsAOXpqQbYdyAeblhWshCrAOfwyBt1BFPpZM/+tj062U41zCPfATDz60DKf3PwZkaVRF1VZO3FVcwMMrw==","shasum":"23d3aac0a1aca9b6abe449ee330e1115b2904e74","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.24.tgz","fileCount":51,"unpackedSize":218137,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICglJrQ58qVvty+2FjgWaS9E/w7jtclIt8EX0EFFAHwAAiEA1lW1VDBKaKfDdfojwhWCbkLv4cCUrslRAEHb4ybVHgY="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.24_1521613327963_0.8583991818159595"},"_hasShrinkwrap":false},"0.8.25":{"name":"tua","version":"0.8.25","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","source-map-support":"^0.5.3","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"e6eee3927e49dd363099b57ba727159410399761","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.25","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-3opWWBB6O0vC1zfb0keniKHlHS+Fq6HQkBhgJfGzJ8/p9R2THjnRoJi2oZkwImkeJzWBCrZXU45Tpa0NHo+npQ==","shasum":"7b63cab1af03b9e8ab5167bd50e1401ce45e19ca","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.25.tgz","fileCount":51,"unpackedSize":218230,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDicPJVh3jI5FHbfsrhCOBLlrbzNl4CY+LoubHYd16xjAIgd77xHCPbQARZc40a5VHX2LoNA3EO5VFIdRryrkE7+M8="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.25_1522056758588_0.1309868344140599"},"_hasShrinkwrap":false},"0.8.26":{"name":"tua","version":"0.8.26","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","source-map-support":"^0.5.3","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"eeb92e7928b2b3428e94c7ded01b74be83e73b9b","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.26","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-RR3w4qIQFEcwPOz+f7WomdrgoOAFvbaY5MXC2oI+aKwy6UtGccugoxKtUUrR5qAF2eAVgOhVaxsrPgmzrqPH0w==","shasum":"4f0b10ebcf9235fd7d21d6e34588e29cb112ade7","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.26.tgz","fileCount":52,"unpackedSize":218653,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDLbfEhxd1rUKNYVGg6idAN6ctNjbZIWHGyi+/YxVI3pAIgRBOgEHyV9CJ9NyDOm10K6BPrbcyb2B9kTfRYIWPsiLk="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.26_1522140299128_0.3455443555655142"},"_hasShrinkwrap":false},"0.8.27":{"name":"tua","version":"0.8.27","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","source-map-support":"^0.5.3","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"6c8dceb114586f7ac04077c50edfc49e880be4b0","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.27","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-6xUP86eT/0Gt3rW9YWfoDRCPffwlIF5p1qn68UN3vb88cUMzQNXmoXsabcglpJQeVBI/lsDXHWBTne4M4c1Rng==","shasum":"67354360852222e6b2e22e1093b2dbea196907f7","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.27.tgz","fileCount":52,"unpackedSize":218612,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa3UiYCRA9TVsSAnZWagAAzeIP/AkZAUYnQnSgE1H6GR8k\nD72B3GYywsXTzTig6yS+NhpyScZANWcl0ZdsjejuTzlb7hECBxsv8IJeL85a\nUAqOTJeq2JqzrH8ZFApcGAWSq2y6I6SI2olq2mnv51ZHmAxsqIfH0XLrFx1S\ngqXrCpa04n2aR5rPNAicYgy4kCfuXsJoc3ZSOk6DdCucNekHCnU4Nr6aNRJ8\noJkbUH0bTwHVLS17PHO1CfA01EzebvioxRdXWvkIvWcS8WhcXda0fMYtzCX8\nAn0wo6l8AXtJDe/pDexES2dAjXnJvn7QNgM2w06i3QRxWKNSbtEAjizaka9u\nJ4cD2s8Fi06676pV89n8Q20lifKemuDMbyebs+Jvjww7dlmsUKiRtOnNxc6n\nFr24rwSqSa69Rat8Bt6UF8V24G23dLfZRxuB/bhOgGtBZm8wRDawpqu65c9b\nPZhDw5fwPifuP0Xl43T3lR5S4rM/VmuDcyphM1re0tQojcH8uXaitvvHDvOw\nViNcskgGqKu8MkNs+F1UouCMAfqC2xlRuMFTMIKc8hbkyMPZ7hnnDqf1shhe\nGzBgtMfBgm04Ao9FWrAFg4hG/UOcNvs2YRfGODWzZ4oIh8O46fxgfmC645a/\n+/bHsyFI785q26GMUT5Z8zdo5jJcjvkLDY5hmYydw+yLmGi0nyk6PnMAXHv2\nBO/6\r\n=SkQ7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICGL7sxe7wuROcP8isAvOevgxYn6OVX08lVzVHrqPT1uAiA5rvVM6BiEH0hXS6cunmj7zJl+ZfbMPAeBCjNpH+t8uw=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.27_1524451478663_0.7327566836213084"},"_hasShrinkwrap":false},"0.9.0":{"name":"tua","version":"0.9.0","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"^3.5.1","autoprefixer":"^8.3.0","babel-core":"^6.26.0","babel-loader":"^7.1.4","babel-plugin-minify-dead-code-elimination":"^0.3.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-runtime":"^6.23.0","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"^6.24.1","cache-loader":"^1.2.2","chai":"^4.1.2","chunk-manifest-webpack-plugin":"^1.1.2","clean-webpack-plugin":"^0.1.19","colors":"^1.2.1","css-loader":"^0.28.11","duplicate-package-checker-webpack-plugin":"^3.0.0","escodegen":"^1.9.1","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^4.0.0-beta.0","file-loader":"^1.1.11","html-webpack-plugin":"^3.2.0","http-server":"^0.11.1","img-loader":"^2.0.1","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^2.0.2","karma-babel-preprocessor":"^7.0.0","karma-chai":"^0.1.0","karma-chrome-launcher":"^2.2.0","karma-mocha":"^1.3.0","karma-mocha-reporter":"^2.2.5","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.7","karma-webpack":"^3.0.0","koa":"^2.5.0","koa-connect":"^2.0.1","koa-router":"^7.4.0","koa-static":"^4.0.2","less":"^3.0.2","less-loader":"^4.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.4.0","mocha":"^5.1.1","node-sass":"^4.8.3","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^4.0.0","ora":"^2.0.0","postcss-loader":"^2.1.4","postcss-smart-import":"^0.7.6","precss":"^3.1.2","prettier":"^1.12.1","prettier-webpack-plugin":"^1.0.0","sass-loader":"^6.0.7","shelljs":"latest","sinon":"^4.5.0","sinon-chai":"^3.0.0","source-map-support":"^0.5.4","style-loader":"^0.20.3","thread-loader":"^1.1.5","uglify-js":"^3.3.22","uglifyjs-webpack-plugin":"^1.2.5","url-loader":"^1.0.1","webpack":"^4.6.0","webpack-bundle-analyzer":"^2.11.1","webpack-dev-middleware":"^3.1.2","webpack-dev-server":"^3.1.3","webpack-merge":"^4.1.2","yargs":"^11.1.0"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，并集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n    ```shell\n    npm i -g tua\n    yarn add global tua\n    ```\n    注意，使用yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n    ```shell\n    tua -i\n    ````\n    此命令会在项目根目录下生成 **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n    可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n    ```shell\n    tua -s\n    ```\n    启动服务器。会自动在浏览器（现在默认是chrome）中打开页面。\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua -i\n```` \n执行后会执行目录下生成简单的项目模板。\n#### 2.1.1. 模板结构\n```\n+ src          代码源文件\n  + lib        公共代码库\n    utils.js   公用的js\n  index.js     入口\n  index.html   html模板\n+ test         测试文件\n  add.js     测试文件\npackage.json   包配置文件\n.tuarc         tua配置文件\n```\n#### 2.1.2. 自动下载\n在生成package.json后，npm包的自动安装会启动。优先使用yarn安装，如果没有安装则会选择npm。\n\n### 2.2. 生成DLL文件\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua -d\n``` \n此命令无需手动执行，在使用 `-s` 或 `-p` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n```shell\ntua -s\n```\n启动一个webpack-dev-server，带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n默认情况下，webpack-dev-server 提供一个 express 的服务器，在这里，额外提供对 koa 服务器的支持，只需在此命令的末尾添加 `koa`,\n```shell\ntua -s koa\n```\n以上命令会启动Koa服务器。\n\n### 2.4. 打包\n#### 2.4.1. 打包到本地\n```shell\ntua -p\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包到服务器\n```shell\ntua -p toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用CDN或者html和资源部署到不同路径的情况。\n\n### 2.5. 启动测试\n```shell\ntua -t\n```\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua --run {filename}\n```\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n   默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n   用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. pretty {Boolean | Object}\n是否在启动 webpack 时，使用[prettier](https://github.com/prettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pageEntrys {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n /**\n * @param params 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua -s ?params, 或者 tua -p toserver?param / tua -p ?params\n * @returns {Array}\n *     uri: {String} 访问路径，用于 server.mfs 获取唯一的页面模板。为了解决htmlsrc相同的问题，优先使用router作为map的key，不存在使用htmlsrc\n*      htmlout: {String} 生成后的html文件的路径，相对于 {dist} 路径\n*      htmlsrc: {String} 源html文件模板路径，相对于项目根路径\n*      jssrc: {Array} html文件对应的js入口文件地址, 必须是数组\n*      jsout: {String} html对应的js或css打包后的块名称，只是名称，所有模块打包后 script 会放到 {dist}/scripts/ 下\n*                      css会放到 {dist}/styles/ 下\n* }\n*/\npageEntrys: function (params) {\n    return [{\n        uri: '',\n        htmlsrc: '',\n        htmlout: '',\n        jssrc: [''],\n        jsout: ''\n    }];\n}\n```\n参数 函数接受一个参数，可以在 `-s` 或 `-p` 阶段，用 `?xxx` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. src {String}\n代码source路径，缩小loader的处理范围。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    uri: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `-s` 后，启动服务器成功后浏览器打开地址。\n\n** 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准 **\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527\n}\n```\n可设置proxy和端口号。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dllchunk {Object}\n配置dll块，至少配置一个，否则会出错。\n如：\n```js\n{\n    vendor: ['./src/lib/utils'],\n    // vendor2: ['./lib/kEvent']\n}\n```\n\n### 3.18. serverEntry\nserverEntry 应该是一个 String 类型的值。\n\n```js\nserverEntry : './server/index'\n```\n* serverEntry 值存在时，debug阶段会自动启动后台服务，提供server对象给入口文件\n* 不存在时，同以前开发纯前端输出的形式\n\n#### 3.18.1. 入口\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n ```js\n module.exports=function(server){\n    \n}\n ``` \n 或者 es6 模式\n  ```js\n  export default (server)=>{\n     \n }\n  ``` \n  \n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n打包后，会生成 `dist/server/index.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `-s` 或 `-p` 后添加 `?{param}` 来添加\n```shell\ntua -s ?xxx\ntua -p ?xxx\ntua -p toserver?xxx\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua -p toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`-s` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua -s koa\n\ntua -s ?xxx koa\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 ` {Array<string> | string} `。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```\n#### 4.2.2. 区分测试和发布阶段的配置\n 一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```\n### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令 \n```shell\ntua --run start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 __tua.js__ 中的配置，生成 __dll__ 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\n  serve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。** \n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","gitHead":"3fa5b5f4e5f00aab2155acc3a71f9454fff84472","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.9.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-5hbGa1A2DXPsGpUr58uLHdwjiJbJD99ZG/A5m4usxCZckJONM13iX8DP4c80YrS+7U8oekPsVOV48MhEKUpQhg==","shasum":"2463daedd07a9ca81320038e4aa63f3854950238","tarball":"https://registry.npmjs.org/tua/-/tua-0.9.0.tgz","fileCount":53,"unpackedSize":225358,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa3YHtCRA9TVsSAnZWagAACEwQAJOj+iN7Ji7Bt35IkVAn\n+kLF3dvSL1Y9UvbZGZfqaC2/jbG/a/Uo2FhzdpZQlafJmYF+pcPxkQsDi3Pk\nKv9femHbv6ODl0SeklZQqKeokaO22X8tvlQj3t7+xFsQ0f+ay0S7pjkYhthQ\n8BlAYwSdcx6Kv0EbQAZSpfDMq7eJju3y8gqqKJj2nwdW3cJPrOPAC+oE5OVa\nBbVj/V529zfFNi3/14hhny+xmu3xU8Se4vz3sSbL22RYmBsjhmtmu1l0hF79\ncwIziziGY94B/12w+ewPaE6tKCJJB5WKMNyH2j1PPiStJf9QE4TznzlRY8gy\n0sYYjklwReMt2m2fZmMbtyevTr8fe2iqD6yuI9fXu4I6/z0CoYoLnQC0Pz/D\nhhIqXNMnG05KGBpYA2DesUEPYYjamogYkbaV4NYN9rH7Nm/QrzSGx0XOukH+\nj5yxdo7MrEMIieJEH7V0VjuhKHdTDXQuBqgd+S4EcQR70kxTvBcad83Yuzsv\ng8MR74/oT5cyvkVpFFp0ei8AslN6UuSvy92fXf/wJGLC9a3XnK2z7UEKZ99y\nGCJih0BBBxCaDgDHQ1jRVlbMjOEJ4rQ8OGIW496/YTJbq4R2swccZvLL+Nim\nRMxxmLo0BwAkqJFrzQ69+6vYMa2nNjMxAlNID1GqoEpHHtw8NtWv8LKPr5eM\nXX0L\r\n=S0kg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICM798sXExN1CxLj56Im/ANeOnXSxgl7cNOg6XUc1Y9YAiEAwOjgumxSli8luQJ2uCbjnA+bK1MpkMs67Rbdtoimwk4="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.9.0_1524466156291_0.996519405156779"},"_hasShrinkwrap":false},"0.8.28":{"name":"tua","version":"0.8.28","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","source-map-support":"^0.5.3","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"507d8d13a5e59d97fdf6539086d578eb0a7fca66","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.28","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-2xGekZIhYMMc9gHKMzkfgJwO9+Sed1WwnoS1cadp3LeH97NWJFtcKnLK8rb+hpgq2jsMak0H0F9fS/KuEDKzKA==","shasum":"6fd51e28402ab549d408a81c7954c7e17b41ccfa","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.28.tgz","fileCount":52,"unpackedSize":220870,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa4p0TCRA9TVsSAnZWagAAY8UQAI7sssif4MZsRHJwfH00\nEgd6/Qb0VEYFx5fubBGO8N4ZUrNsIB2ejMWCCe2pYEN/Q5DyoYVRbE3dEUNI\nMIvhmU1Vy+2YLU0q8RXHzjAhOQI4x9JtPJ/hTlmfBus4GVEV/o5J7zAHUBrU\noFC3PhzgKawwrPkdmma1vdcXPCqlowMbdt6sXcEkdZEsBmh5TQwl59+Ip44V\ns8tT4GkAHIISt54hpTWr3NrrCOR+Wcc78wZ9MRWD9Ei3EfQDLcmFpoNk1XFY\nOhJb8pjUaOl6PMYBDa15qobFd4nAkIDn3yLEiSferZvGkPWcDoqXeOiudSEO\nf14B+UqmriCLDUmBC5VuM3ZlOKAUBYIxEl7V0tva+Nu4ng6CpL59XwiO+eka\nAC0agm+qG7gsqKFmg91QiATU/MvJPCbD0ybnY7vcz2xLIxWtQJLGxm33LtHC\nZhqUHlaSaA0lXXh1STuPPnRepGBxywKkrVQl2ttQ5UyZ1sZTdSaU+/tnP8We\nXj6Q6z6d5YMSPiKSjKZugXwPWbcZ8dJy+2cE4f4Fg8pDXngXMQyoQ4P3CswL\nJw9a3ThIW/ozXnRPPa9yPc9peuX+MmV1CO9M08uzZUAPXDlYgM0rB5Za2mcQ\n7WKxtZUZKkl8gwS7T5Kdkz3GFa68gTLdmsFjyq8iuRB8+pjGAVaLUZ0hc1lj\ne+lF\r\n=6Yz1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIApYn9eo4AW0ZN3mCymL96iZqSXTfU+LdtwM7BCK9WT2AiEApdLi67AvdXR+8H5MalFg5oMymFvdws/wOHMUWlQxKqU="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.28_1524800785614_0.27900601434781525"},"_hasShrinkwrap":false},"0.8.29":{"name":"tua","version":"0.8.29","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","source-map-support":"^0.5.3","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"63df65d7aecb47fd379a8f9d384a81629282f1b4","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.29","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-JXl9uZuPdo2GxsBjbFvSTMssokz66OoxKXkD8KG4vBZUtMD09EMMILibZiKnn6HoG+A/ePRYiMrN4Lp1kdHxfQ==","shasum":"0cb49ea53efd8f91b059d4d2c194954d7bd88127","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.29.tgz","fileCount":55,"unpackedSize":222348,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa4tfdCRA9TVsSAnZWagAA6X8QAJfHURfpMxuhjydCwfno\nCdXru46xACCQS4Y0GcKHyhOy/EV2oyTkbiMawzjAaCBZo9sxk8elM0FZub24\ncz2SEUB6YGIieBcQp4n2asycG4ZIu+6NpMOM65Q2QtLx4pl+u6+DA+6HJW56\n8Tnw9PsjSYVw6KxTqtFa3GqYF26LQSVvsErkHCApDOBma7Q23vgWFoDPnwGR\n60cy/Gmg3tEyuLq4mwqfrSNKdmoAoZ2KGV+2VcyLBkJUzoHw/wBYzcDxlQrz\nChoxgjbwT75QvUiTV1C092SxugwQJnOQUDWdTV4RHF5nbphyQKd8SmsRnOx9\ntjSahQbPpPA712+/E2zTrqrb4DgxKKhvyHbeWq8BYjSwLCaFVa7iPN++5ItN\nNP+YWxh/W03TmQbi5qd2WEd1KYiOS8faZFLlrX6rzgwwEMt8FErIpk2Kwouy\n0fdfXY14crLutonp5RYJvJnz6z0Zaqs67InQaR/s/Qq0137Xa2BjOg2jARLN\nESheKMXpeIjaf2G2zKBDtVKEtkztiLB3Kr6LdTpv7Hq/9fGk6qHwk2pmNVKb\nqlvrANU8dt7Y5ZHp+WCN2TbkIWniSp/IwvPS7/TFL2irTNj1TosN2miEOEmP\nXEPvortC/G4x8MJu3WbjL6ZoHG/H04yKmTM24oK8MxNYVlZlWxgMzU4qht9X\npYtd\r\n=26dG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC5ms5fWHZ7V6ZSAQIenQT5PKhOFl7nQgDdEqCaHa61rAiAcLCdilaOzRw3MRm4oR+xoSeZSCBMbGS9X7yEpE0dTqQ=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.29_1524815836285_0.43241441791189117"},"_hasShrinkwrap":false},"0.8.30":{"name":"tua","version":"0.8.30","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","source-map-support":"^0.5.3","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"63df65d7aecb47fd379a8f9d384a81629282f1b4","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.30","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-ZaLoZdUI5uPzVF2wwu+KxFgusfOpQR5NxlIBiQuwAs15N8RIYImJK+y0UAzRlS4L/t8Io/ATPaSEPhRTx+C25A==","shasum":"887ce4f81b727da155db42f9cc6a73c119dc0ff3","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.30.tgz","fileCount":55,"unpackedSize":222284,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa5towCRA9TVsSAnZWagAA1BUP/3qDHoDogwoJO15sJEcW\nXkQ80a8JvRC6HMEfygJ2bqwbDANqqW7b9II5Lb6+q3rMkGL3RfIV4jxC+J2V\n9eOXW0VdFEYSkhXUJ0+kmMFQU7FY6/dgOD4CIQXdmzgmlq7TrcMEB4EmSoH4\nX9tFkE7wvaGVRRrypLg9/9ORgF78fzSJ4K9zYKx7ITUuvwjLTxw3/+Uu99Hq\n9BrWchZFplfn6vcbOfaMYTSPPZ66LrUdJnK04D4zWK/ZZ4EIrdXD5JbImdgH\nEhWJqe5phzzoz4hve8dMwaPfloqiRzAUFaqy8g+yM3bCA1hMAh+c0KDDEgDA\nvQoNUDALkwVBVQuWh1wvq0gnF3U4YveoWHEajAcGe7PCOtF4RPtaNaZaCwIg\nvnGi2L3/WwBSsPTYoLmMzopOajOt/71lDRpVcKvNUeqiR3Dx34wYFYvnOECE\n46QbReNpuSr9200M0qTl5cfARcNUJRzIMJqtmFc5HpN6WAf3OsYgPbzxJ1oD\nZqD9WM0fcDDzp473SMiv/YnHAvJYHMuZYR9QMbAqy+OHZ78wAxM5zT7PMbFf\nLrhp4YocEkap7zwLxGixAtccrv7ZwrnKzmEwqdeWKS+nkFFKq/aklScrmRUY\n5nyPRXKYwkfKpyNxPr3E2RCy38z1HWDOjBmUbCSzrmcPp9/w2R72HcX+WWI/\n2MQC\r\n=gGpM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDVgkzhpngCqe4kXBhwxYslSm0DjoawODevgtz5Mq8wAIgS1A9R+JCGX1J+4V0hJiuJwWWP/truUO3P6tFQkEus2Y="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.30_1525078575308_0.9554117425071158"},"_hasShrinkwrap":false},"0.8.31":{"name":"tua","version":"0.8.31","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","source-map-support":"^0.5.3","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"63df65d7aecb47fd379a8f9d384a81629282f1b4","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.31","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-0PDIKMjqJeNyPABiBb/90KtrwUxmYbCTc9FoKsDYcmsMdsS9/Ev2hr0ue9LOnivmm1gPWTWDpVr1opHZI9uIsw==","shasum":"d17a58427d31a3624df89fa1094fdc343fce1979","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.31.tgz","fileCount":55,"unpackedSize":222284,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa5treCRA9TVsSAnZWagAA2n0P/A3L6X6ma+BVqeHDu/qp\nj4iUoQagC3wrRQpqPnn+ZZo7fUHAw61TQrSrgnndzyGGtn5Z03UQhfglFaHW\nFM6U3KEoJq4iy2LBmEM8gr05bhj2e/myuJ7DE2+F5Kv/KGYWTbRNnIZzVKqZ\nDz+RE2KkWBrP35ySLL38jci3TS6AggBc5CGkdWKuyd9iQqls9bmUfvuWCAST\nB0gQtk6j8yo9rCVqtKlHMOYZxy6965K68FzcBb0IMBNKpqa+s6cUyIQgqfJe\n9y7h75x/ZMiuu9k1SOubbNRPErw+ZV4Iji5SWPhjR4h5WUmPnobtuoiIyWbL\nR6dAe2Op52onOrm+3wQomBC+f8G1eQuGjYpB+A5tY7RjGzwHq2NDIFXdS+f3\nqPU38jdREwPz5A4RjCmkJLWxcb2zTl/DC9FQC4CnDhq98mpdbt60W97ILm0t\nlWONrlnsiS0AslXlb7RgBgtIP/W0IOEARHTfvYwSA8ihVFybbHcf1+ektiY1\nd/XaM37Hfc6RUnuUC+JiXZ+EAZRNH6tVtiS1L+S30lrTuyzce9yw/Cy4dKcc\nP3S1WieUlSw2DbuQCy95/Uj1rRggneXnz+0GnbJ+lo6t6lK74mrZ0xlAmzyH\nC6kqD2WBW0tWkUa33k0aW8c/hqd3e1KYd3j9kELn/MWTgpFiCVfl5qjq9+e5\ntjMe\r\n=1Bzk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEh7V00ZCCfgRH3C/SndpceVOi+VwlsPQjTeTxeS5gOmAiBdQpGC731j/+xzGiobuFzRsBSf26SjhY4DJoWLYUr+vQ=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.31_1525078749617_0.016884267780862494"},"_hasShrinkwrap":false},"0.8.32":{"name":"tua","version":"0.8.32","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"latest","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","source-map-support":"^0.5.3","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"60bbd1a4b1aa38ac3511dacd9d96accd152f3fea","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.32","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-PfCrnkEeNupfVwxdpFDduQffF9MWNzSGt/IKnoK6AohuyfU6/MqpwjkvmBLaiRxkfGFCotX372ZeXWRJvhB2Sw==","shasum":"3580d6852418ad3a8090ff4d46f0c542d2f42bce","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.32.tgz","fileCount":55,"unpackedSize":222397,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa6WX0CRA9TVsSAnZWagAADIQP/iYtdm/Hi6qRKkpyXvjF\nE7BsklHXbxBKw8j7CIHwA6CTdfmwBlu2VeCNM/jc5jAs/ht0qbFLhjqvle2+\n+TkgCdQRuztCZuPZ1I+/PAWpuxwk5BIEOYeaJ+T47a8huJ0uuUh4ovhlClSD\nzxuE0Y0PjRlJgZemtklqDkVxZ10QuKcbcWyAWDiuuACAM2ohOIFAYF+efifk\neaLmz/rLUoQyO9g0o+Pv5OK0gAjkQVuyOIa/o0+v6x24asCm2YCXLH26XxFq\n/QznUfmpVq1EEp6iM8MfpK2+xKNAeKUnvyZKrZAnDq6L9YsX1sLcq9tg1K4k\nva6W0aYJKeJgALN426u3KSSNjMbbsZQfnr+gGlV2iAUafLOCs/ZzO/T3hn0c\nsAqZjAD1a02baWYa5eFFRPaKXwfX7ZPpMXIGEbs5bs5/Bifar1LSFHaB5K/2\nMjcStsFsSA/FA6ThOjDxKMWTfGKB4J6l/NwIEp0QDxSa8fQGgtX7yCW1MDjd\nXNSTlvH7cZjc4Eft6xDQKKMYE5fBrwN8WUkI3zUufJFEkXjc+dhlxOCC1c5q\nZfiHwQc0xlo8hoaW/4aKWgbiS81zczAwIYIAUFcJmnPTrUoczdRBkdae7iCu\nOKFK/yJOjTJRuOylMqyScd8/inGfy3dz7Gex2UowmvDuP5ko7ba+BGeqGMKg\n/Spv\r\n=aKYK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAl/bMeBcTYuenKKBVHZYnMv6cus1T9uY3I336AET9jzAiAUI5swXXISrgGuYVgFWboD3zrvhVCZoTmAr+YfgcDTCw=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.32_1525245426432_0.9427211902934702"},"_hasShrinkwrap":false},"0.8.33":{"name":"tua","version":"0.8.33","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"^2.0.1","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","source-map-support":"^0.5.3","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"7751beb32400e5ab859d139dc3a3beb988ed60ce","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.33","_npmVersion":"6.0.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-/j6CbGeHn7QE/KueHadgWvY6pZTTh1mznD3ith+bfgOnf2y+xbGlM3a8bs5HfkxRj2fH4BEoINWhzxb77IZADg==","shasum":"878d7e0d4857acd7d19978c8ffc68629dd855721","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.33.tgz","fileCount":55,"unpackedSize":222397,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa6ZYmCRA9TVsSAnZWagAAolUP/3jbrScaiSTcid2+ZPWH\nZp0h6dc5nA7cxn4D5TiUCBU4I5Dl3nvL+YVe2TFSWoIMAT/V68BIi6s7o3Eg\nWGqnZQks+hT7umPIHtA5iAJDM4P4DbONDYrB8/R1yK8Hn7LlmeJuha4p03Xs\nNs+cZZeb0Syc/B+XQXYsobMX2to/5ALCGvql0cUSMZTGyupineVmazXZTocw\npIdvFzRKRcU+KVxO0mwl+uQG+jgP9qrWsCy9hNkW6tJOXY5D5g73mJHAZ84O\n6YoRastnf45hA1tPAL7viA1+4iu7FbsX7ESXji/MICsvwwP3hbF7vWMMraQf\nlC4zPFHXBi01k5r7Q5fBl21+4pSONYlN4HHELO70f2ei4M+np5odS/vR2yMz\nLaGG1X6I+6QJq8jY0O+WQMPbqVOJJJzmfksbzvxlHEKkCaAT9ixD06Do52jI\ngHFuUOyS6KJuxMMpk0MqJHMGOGvcQjNBofuLUACpDiZTfoJa7Zj8vDLC6MaJ\nSKYK/Iw2naxiRf21fwp4Suf6wLbxiBHXt1b9/In4blyw+FFYCOMld+F2kxhA\ncuZ68zOVJZBGt3E81VM8uitYpTaynjHpEy4HeAP5u7HY+QMzO5+M6EEAWCkm\nzvuqLSa4iT+3Swzez3pk77xQ4tLKYsWY9+VvedMN3Hu7qJSHVLmIydIBOZlp\ncAnu\r\n=f3pg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1Qn4mv0hLiHFRIrcVwgwEw1+4+i2cV+KoHr1L5mpayAIgGnc4pMVM0MXvlFUD+pHWBZT3zGHMPNrdlC/S3pGH9jA="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.33_1525257765866_0.8918053585098913"},"_hasShrinkwrap":false},"0.8.34":{"name":"tua","version":"0.8.34","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"^2.0.1","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","source-map-support":"^0.5.3","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"2111b86c99e05bc6f8f91501ac600f1a7deb3669","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.34","_npmVersion":"6.0.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-KiqXaU6BnOrte+a+91o7FxIAGF4tEDyMVgl9ZauRjCrmn0G0MEoTw9G+kfQPFiULbePDRfp4Zy0fOB/fIwjUjQ==","shasum":"1bb166adffe510047d3915a638fa92c9f21a9643","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.34.tgz","fileCount":56,"unpackedSize":225155,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa6tDDCRA9TVsSAnZWagAAd6gP/RW3xVg+Mq2xve9l942j\nScDfxaouUwoPPE5ZObFty9QlhRRe9ZDBDXLt2gqlN+tfdRq5ippPwNla36/t\n8lHGARpXngU9JlEO22+CYnubRXtl3SmcLvPlEKFi9R2gNGGQvNwZyRebKuxb\nQIV7wz+ULG+pLiTzkr4vCkR29a3M64RLBA6xo5oqSuJbnanGLmf0Bh+avRov\niAQ7H6WIp7yIbNy00g8dg7RaSSbTzQp5JrTQCss4se2L7ETeN6uvlIQK8v8U\nDDBwrGjkWLUEOPLGeBWph0NIgFgXI+WL0j9fg5+97q73RMJffx+SyrIXwp8n\nr3bzvS6PaV8/nxmqHha19ouhaP8fExixry3+dIaDIyAkUkUAw9bcFQVBndgW\ncwVkcFFnOaRFphO44K4WIeHC6nr1m2V9kZFE6bNU6z/gcJ35y20MOiCDptZm\nf84He+B9UgVNkPTWBKv25Q4DDq+BTDCMl4oz5spOcZZlG9Cs2GFEihrFKm3r\n4U2JkcUllioCXTZNf6tSi0wbrRqoYV2IkggdRWSFaxC4XoO7UUsfgmDM9DA0\n67EbnJAFK57uWHDQzgMlry+5a3YwjNikRmrKErl4iPjUbnfN0Lq0tS1e3QCF\n1QPE1LYOqNvldKWMS8LMYcApxGDupURrtNRzsveFcq5b3cwnSEJ5dcAQvKmP\nAaFJ\r\n=hHte\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAOZL1XkYR574MReI5eBQXxI2MAvHN+j281jP2HfMMieAiEAg3bUiWUQVdZWD5yamx+TX26S+Ol22845W+5nbLqUKcA="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.34_1525338306641_0.8076840425213638"},"_hasShrinkwrap":false},"0.8.35":{"name":"tua","version":"0.8.35","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"^2.0.1","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","source-map-support":"^0.5.3","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"227d5f2d26b9d7025abf967d10298b8bf7b38239","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.35","_npmVersion":"6.0.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-Gp6MI3ZCn+cgWLU7LEFOra/ijReR8VBLLwPh0W8Y8sVdewUm+QQHjDZWN0JH98yo03zRUfffbqrL2oE568HnFw==","shasum":"0de9d5b5ad23360cb41c5b30165fbb108c96ee53","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.35.tgz","fileCount":56,"unpackedSize":225244,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa8RGnCRA9TVsSAnZWagAAeXkP/AyIhIotYeBClnf22YR5\nzQ3mq6GPfRK2EqcsfanyBzVAYC5ntsL0Ody9GmPPGw2eg9GE+tJGxffZJiRJ\nK9zMSRbN4z8edh3Db03ReusX0NVyOFHxyzlJNYvTAbLiw8ge07Os+uEfg7dK\nBHgH3zKAeyNu2Tuoidq+QNghhoSfMV23epZa1hEtiP5Qe+OnRABwdLO5ff9l\nf6RziCIS04fc0yv4BhjTQycFSx9UWuMBc2IXR9HmFX30A2rwee/o2VV0RiWz\nQoN85b1ATgF7IU3JmpREPeEJL+fr05mJb8YvaYdEHl3Ehu5IiNE9thJ0TXe8\naawPSfhTSFzTV6XVPYrwlARN0JhqF+cDtyGCJbTPo1rpaEk7nHIfYCe2KG/e\n/w0h4db+3KVwpCH7wfiYEGpmXohaul2BcyKArr7oirXEFeC2aDIiu2+FLVas\ndxAqgxdUXWHdzodv4DzOI8++L8etB7tXuhckgCbGBSIp50ToNWjlw0EqhAxI\n9jFT9Ll/Bz2LObcqHGyaEUlimbyswOK5pwGdYQfCkxKzhjv2lD+CmHOGOS3I\n99o4CgXCnoGyTL0kXZHMffWyiKJwt4X4N1EMWFjVnRhYAUC0BxH6KXs6Z1ky\nbCLCg+WUOGtix/T9vc2Lmrv/BDPnITw9W/zQ8tob9qdNPWnr3yGoBJ1wGhN6\nmgvd\r\n=GH/H\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBYO8q+fRLxWV5sdaODabc9Bp+NUvz0ghv8fZp97tGTFAiEA7vdo8gMDCrXyU9Gx2cuh+fFS26+Fq9KBqPoXiclqIiM="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.35_1525748135050_0.6441833612128727"},"_hasShrinkwrap":false},"0.8.36":{"name":"tua","version":"0.8.36","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escape-string-regexp":"^1.0.5","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"^2.0.1","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","slash":"^2.0.0","source-map-support":"^0.5.3","source-map-url":"^0.4.0","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"4c51dd378257a5be010996fc3fa91c7a5ecf73b1","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.36","_npmVersion":"6.0.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-3da6UJpDtHV2CUqiom+ytTffmX9q+cGj/Ohq4ShNyVZp4ZFee/Efp83YWH4KeMOle2VhGrbfG7pXk0LwpnpPJw==","shasum":"f16f8649037f3d41ec98e86370a932dd3e20082a","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.36.tgz","fileCount":58,"unpackedSize":231435,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa+TSlCRA9TVsSAnZWagAAlwAP/RUfx1ce9FgG4wnjD8di\nuQlwZMc9ydBV2jFEhhDKF6VAvlqaDB8YS2mIz3iSFM/G4ZY6ISiNHxxq2zDm\nFNfPR7dsjjv0mFgoLt/7SQbLklrjaDXWENYpHhgTP9HO+3NCqT193ErTanI7\n1PaKPkHBg+eNZCFS1uaaVBR+oBJA2RYO0l25l5kfotVttLK2hmXm9QoXmBSo\nDIEB5DxmqC3M2b80HYK5W3Vg4QqZPG9t/j2Dq6CoEaEezgHCX0fcSM0sP1oZ\n9RLY/+Pjh4syCRg4bXeHKROGmf7LLP2bOpEJupXcbnnCroQMVSnhx/mOid2w\nUEB2Eqp05jevXp4vw7KPVERUuLRaK6hcBp9L++wJRGEBVr/zxZiTn+KF+Jj+\nSOEfv9d6j/aDFllNAWxCXfBsrJ6soepYTR0RxEcPbbVPAPb66Opiv1nK5mb+\nHDzg3FtmuwZ89QmKcfxGhRA3fyhdyY5/X+dLY43MPo03LIFfswQpb4CJAHWC\nNHikSzfG9PYvPtYG/OtUfiD80vxC2wsJOCJRJJ/AthpNilMg9CvthVoBmpx6\npDKqIjKN7F7ATXiJIL87jmccFi4RJ1lC9lN5rv5FQ/A8Mc2CKkOOguPr41vk\n9gzWw7RimrYjmFIxItQas5gxhMlgdRVVcA2cI2wAUmd1JAAEQrPWVrShWG9/\nLFi1\r\n=bKLu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEjJmAWEyvJGnEjwyIbWAsTbu8e+aYlCT0uccIGBf+tVAiEAktvid8CK4pJoW2kJHgaV09euWyRaIZbJ02w1DIR0zJk="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.36_1526281379255_0.6485798266682663"},"_hasShrinkwrap":false},"0.9.1":{"name":"tua","version":"0.9.1","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"^3.5.1","autoprefixer":"^8.3.0","babel-core":"^6.26.0","babel-loader":"^7.1.4","babel-plugin-minify-dead-code-elimination":"^0.3.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-runtime":"^6.23.0","babel-polyfill":"^6.26.0","babel-preset-env":"^1.7.0","babel-preset-stage-0":"^6.24.1","cache-loader":"^1.2.2","chai":"^4.1.2","chunk-manifest-webpack-plugin":"^1.1.2","clean-webpack-plugin":"^0.1.19","colors":"^1.2.1","css-loader":"^0.28.11","duplicate-package-checker-webpack-plugin":"^3.0.0","escape-string-regexp":"^1.0.5","escodegen":"^1.9.1","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^4.0.0-beta.0","file-loader":"^1.1.11","html-webpack-plugin":"^3.2.0","http-server":"^0.11.1","img-loader":"^2.0.1","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^2.0.2","karma-babel-preprocessor":"^7.0.0","karma-chai":"^0.1.0","karma-chrome-launcher":"^2.2.0","karma-mocha":"^1.3.0","karma-mocha-reporter":"^2.2.5","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.7","karma-webpack":"^3.0.0","koa":"^2.5.0","koa-connect":"^2.0.1","koa-router":"^7.4.0","koa-static":"^4.0.2","less":"^3.0.4","less-loader":"^4.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.4.0","mocha":"^5.1.1","node-sass":"^4.8.3","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^4.0.0","ora":"^2.0.0","postcss-loader":"^2.1.5","postcss-smart-import":"^0.7.6","precss":"^3.1.2","prettier":"^1.12.1","prettier-webpack-plugin":"^1.0.0","sass-loader":"^6.0.7","shelljs":"^0.8.2","sinon":"^4.5.0","sinon-chai":"^3.0.0","slash":"^2.0.0","source-map-support":"^0.5.6","source-map-url":"^0.4.0","style-loader":"^0.20.3","thread-loader":"^1.1.5","uglify-js":"^3.3.25","uglifyjs-webpack-plugin":"^1.2.5","url-loader":"^1.0.1","webpack":"^4.6.0","webpack-bundle-analyzer":"^2.11.3","webpack-dev-middleware":"^3.1.2","webpack-dev-server":"^3.1.3","webpack-merge":"^4.1.2","yargs":"^11.1.0"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，并集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n    ```shell\n    npm i -g tua\n    yarn add global tua\n    ```\n    注意，使用yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n    ```shell\n    tua -i\n    ````\n    此命令会在项目根目录下生成 **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n    可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n    ```shell\n    tua -s\n    ```\n    启动服务器。会自动在浏览器（现在默认是chrome）中打开页面。\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua -i\n```` \n执行后会执行目录下生成简单的项目模板。\n#### 2.1.1. 模板结构\n```\n+ src          代码源文件\n  + lib        公共代码库\n    utils.js   公用的js\n  index.js     入口\n  index.html   html模板\n+ test         测试文件\n  add.js     测试文件\npackage.json   包配置文件\n.tuarc         tua配置文件\n```\n#### 2.1.2. 自动下载\n在生成package.json后，npm包的自动安装会启动。优先使用yarn安装，如果没有安装则会选择npm。\n\n### 2.2. 生成DLL文件\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua -d\n``` \n此命令无需手动执行，在使用 `-s` 或 `-p` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n```shell\ntua -s\n```\n启动一个webpack-dev-server，带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n默认情况下，webpack-dev-server 提供一个 express 的服务器，在这里，额外提供对 koa 服务器的支持，只需在此命令的末尾添加 `koa`,\n```shell\ntua -s koa\n```\n以上命令会启动Koa服务器。\n\n### 2.4. 打包\n#### 2.4.1. 打包到本地\n```shell\ntua -p\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包到服务器\n```shell\ntua -p toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用CDN或者html和资源部署到不同路径的情况。\n\n### 2.5. 启动测试\n```shell\ntua -t\n```\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua --run {filename}\n```\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n   默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n   用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. pretty {Boolean | Object}\n是否在启动 webpack 时，使用[prettier](https://github.com/prettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pageEntrys {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n /**\n * @param params 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua -s ?params, 或者 tua -p toserver?param / tua -p ?params\n * @returns {Array}\n *     uri: {String} 访问路径，用于 server.mfs 获取唯一的页面模板。为了解决htmlsrc相同的问题，优先使用router作为map的key，不存在使用htmlsrc\n*      htmlout: {String} 生成后的html文件的路径，相对于 {dist} 路径\n*      htmlsrc: {String} 源html文件模板路径，相对于项目根路径\n*      inlineSource: {reg string}, // 内嵌除dll文件外的符合正则规则的文件到页面中\n*      jssrc: {Array} html文件对应的js入口文件地址, 必须是数组\n*      jsout: {String} html对应的js或css打包后的块名称，只是名称，所有模块打包后 script 会放到 {dist}/scripts/ 下\n*                      css会放到 {dist}/styles/ 下\n* }\n*/\npageEntrys: function (params) {\n    return [{\n        uri: '',\n        htmlsrc: '',\n        inlineSource: '.css|js', // embed all javascript and css inline\n        htmlout: '',\n        jssrc: [''],\n        jsout: ''\n    }];\n}\n```\n参数 函数接受一个参数，可以在 `-s` 或 `-p` 阶段，用 `?xxx` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. src {String}\n代码source路径，缩小loader的处理范围。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    uri: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `-s` 后，启动服务器成功后浏览器打开地址。\n\n** 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准 **\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527\n}\n```\n可设置proxy和端口号。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dllchunk {Object}\n配置dll块，至少配置一个，否则会出错。\n如：\n```js\n{\n    vendor: ['./src/lib/utils'],\n    // vendor2: ['./lib/kEvent']\n}\n```\n\n### 3.18. serverEntry\nserverEntry 应该是一个 Object 类型的值，是指服务端 webpack 入口文件\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n```\n* serverEntry 值存在时，debug阶段会自动启动后台服务，提供server对象给入口文件\n* 不存在时，同以前开发纯前端输出的形式\n\n#### 3.18.1. 入口\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n ```js\n module.exports=function(server){\n    \n}\n ``` \n 或者 es6 模式\n  ```js\n  export default (server)=>{\n     \n }\n  ``` \n  \n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n打包后，会生成 `dist/server/index.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `-s` 或 `-p` 后添加 `?{param}` 来添加\n```shell\ntua -s ?xxx\ntua -p ?xxx\ntua -p toserver?xxx\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua -p toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`-s` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua -s koa\n\ntua -s ?xxx koa\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 ` {Array<string> | string} `。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```\n#### 4.2.2. 区分测试和发布阶段的配置\n 一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```\n### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令 \n```shell\ntua --run start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 __tua.js__ 中的配置，生成 __dll__ 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntrys` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\n  serve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。** \n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","gitHead":"0c12fa0d7ee5e0b2c874c79a7440502335195955","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.9.1","_npmVersion":"6.0.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-OqlOAG/hryO9A4vytR1IwDdC7ShLFLvqHfJpuHaDbzO2JjfgkEu/+gz72dttFll0mdQHf1rGyI4KR2ct4bS0MQ==","shasum":"dc20f7350572c7fd977601d35191adbb85aadc6d","tarball":"https://registry.npmjs.org/tua/-/tua-0.9.1.tgz","fileCount":59,"unpackedSize":237540,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa+osDCRA9TVsSAnZWagAAPBMP/jrIpt6POgivd7EPuRhF\njvWD16vpMKlvKOYFP/uUJomm5+HBa5CVqq8R8Du/+MATlAMiB9EDj00MWBTX\naixGvJkOBwRs2BkBt4VP091f7FWxXlxRKqufMp0cBMx1ws6HtyhTHSmv9J76\nY6iCWkLKb2JUvB2iXVBRjPOdpQ98W6GxTmFMsPjAmutgz13tLB2M6yrNUyEK\ndgsLVAsp8CpQv8sZJiaQOdEiIv3L7gwiI2jxa3wnEXf0d2gSgWtpLNIP9Z+o\nq3czlrJA6XrYVyqCUhto7ojI+a++OKkE+DCWKfvnyOaYV8JoC21f+CL6cGz/\nqgsSbFvDir5zcZc0VWfkJ8G2ON10+3lZlj8pFLjvfLyJnWTJVwh1EXllEGhl\nTIzxys8WeQPhVPIG9/xnvnE7fdAYacGDeBH/dsrtC4MDennmBcn6LkFFZUhj\ngFGjn4e6SGmVCZfd9aQIaqAY8HIs/lQCGu5ohNScHNIyHxwmyEI3jRcUAWAu\njWEO6s9eE/dnjA56xivtU4ZsrCI2wbbwQSlNjT479vxHfCoQq46U4yV7pwzM\nL1SmdqnLQGVOqRIAJtgSMtJb73yk5BfKT8ICh93mzmG59DpNPfzuWRUuNeQV\nnQiY0e2AlGfFFWeHzBsHrzCFGo4MjhSFy9f+Fy4nCh4uVzhjgPDZYho70u7/\ntJqe\r\n=qlhJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCcI8zoVT/QEN0qwrMevFiRK0Dl0O/cRRWUB/y7KcjNLAIgGUyU+bkpcZxmM9RkIwX8753lyFjz3sYC0fhrL1mZeZo="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.9.1_1526369026548_0.9802133689234547"},"_hasShrinkwrap":false},"0.8.37":{"name":"tua","version":"0.8.37","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escape-string-regexp":"^1.0.5","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"^2.0.1","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","slash":"^2.0.0","source-map-support":"^0.5.3","source-map-url":"^0.4.0","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"52de4121ad935b9ff6afed8762752c628ebda057","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.37","_npmVersion":"6.0.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-BG7+NROlD3iGc9YuLpg8YlsA4s84YUNFXD4BdsjYRnWvlLSQxr4xMOWgNK12ORui2Yom0ebP1qhpe991TAnFpQ==","shasum":"1dbc275b8fe9ab6fc75c6f2844e2e3d0185f0cf3","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.37.tgz","fileCount":59,"unpackedSize":231871,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/TwiCRA9TVsSAnZWagAAycYQAI61Q9NYQs5Q1twaoGWK\nWEjZYevVinexuukL+j05FxlKaJxKS7nuzxNQjpxJzx5UiVYvxf7OZZwoZ1dh\noDxCnIIbf0OGPfL/o4ys4AFTQvSWuHCH8qOSZhZU0rf3Uw/AzThsq3yniJRp\nw1Vt0eIxAwQgavriT4CEAoGIW/7xZE6vNNfd6Edm3grHrwKnMeiV37jd1jAK\nB1jxEL7jhLG7avhUmNRt3n2hSNGsMssPAaQ38c9AmRTPeDndMeJurIMjBrfz\nBfOoJCLciPlh65orwznFixuud+nRq3K+7JNzilGk3/fRrNPKqoljNzbI7yAk\n2LwpEXl9lHwdgmXmXUmUsMhhutL7HcNLRJbzjUSg00HRknDJDKipJ1IhQFub\nXWzdA/yLUfRyY54UuE/UjFO1xhcMDI/ZUteoyzXrXMLAUyurJM2brHAY3N84\ns82rDcI+ajrTjJRGbA6CQ3P0yPVyzi99jcKTNuoRg6Ajwro0f4oRTnpIrfZX\niqf3tk+4uxL5ENVvSX5B93jxcqVHBXa+TLh8FcZ4iu/BtmL4z2b2PNkizDXX\nQQu9HJM4sxMjBlAALJggMUnVdxLmuUVMLKo8S6PUbxQF1gAhQLdvU3toqyMW\n2IlQ7q+opY36s2B/nbx4TaFGwfjylSeAHfeaNK5plCzJHWFSjavpuJ4p4I0g\nZJpt\r\n=8XXL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB2s36vZ8CF0C13epGH/KydRT+T/jeiOZndrV70uHumGAiB/wMnautiVf3z8RQEy48MBv3llB759/cvJXcI3u/5gzg=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.37_1526545440630_0.9305903297744731"},"_hasShrinkwrap":false},"0.9.2":{"name":"tua","version":"0.9.2","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"^3.5.1","autoprefixer":"^8.3.0","babel-core":"^6.26.0","babel-loader":"^7.1.4","babel-plugin-minify-dead-code-elimination":"^0.3.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-runtime":"^6.23.0","babel-polyfill":"^6.26.0","babel-preset-env":"^1.7.0","babel-preset-stage-0":"^6.24.1","cache-loader":"^1.2.2","chai":"^4.1.2","chunk-manifest-webpack-plugin":"^1.1.2","clean-webpack-plugin":"^0.1.19","colors":"^1.2.1","css-loader":"^0.28.11","duplicate-package-checker-webpack-plugin":"^3.0.0","escape-string-regexp":"^1.0.5","escodegen":"^1.9.1","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^4.0.0-beta.0","file-loader":"^1.1.11","html-webpack-plugin":"^3.2.0","http-server":"^0.11.1","img-loader":"^2.0.1","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^2.0.2","karma-babel-preprocessor":"^7.0.0","karma-chai":"^0.1.0","karma-chrome-launcher":"^2.2.0","karma-mocha":"^1.3.0","karma-mocha-reporter":"^2.2.5","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.7","karma-webpack":"^3.0.0","koa":"^2.5.0","koa-connect":"^2.0.1","koa-router":"^7.4.0","koa-static":"^4.0.2","less":"^3.0.4","less-loader":"^4.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.4.0","mocha":"^5.1.1","node-sass":"^4.8.3","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^4.0.0","ora":"^2.0.0","postcss-loader":"^2.1.5","postcss-smart-import":"^0.7.6","precss":"^3.1.2","prettier":"^1.12.1","prettier-webpack-plugin":"^1.0.0","sass-loader":"^6.0.7","shelljs":"^0.8.2","sinon":"^4.5.0","sinon-chai":"^3.0.0","slash":"^2.0.0","source-map-support":"^0.5.6","source-map-url":"^0.4.0","style-loader":"^0.20.3","thread-loader":"^1.1.5","uglify-js":"^3.3.25","uglifyjs-webpack-plugin":"^1.2.5","url-loader":"^1.0.1","webpack":"^4.6.0","webpack-bundle-analyzer":"^2.11.3","webpack-dev-middleware":"^3.1.2","webpack-dev-server":"^3.1.3","webpack-merge":"^4.1.2","yargs":"^11.1.0"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，并集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n    ```shell\n    npm i -g tua\n    yarn add global tua\n    ```\n    注意，使用yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n    ```shell\n    tua -i\n    ````\n    此命令会在项目根目录下生成 **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n    可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n    ```shell\n    tua -s\n    ```\n    启动服务器。会自动在浏览器（现在默认是chrome）中打开页面。\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua -i\n```` \n执行后会执行目录下生成简单的项目模板。\n#### 2.1.1. 模板结构\n```\n+ src          代码源文件\n  + lib        公共代码库\n    utils.js   公用的js\n  index.js     入口\n  index.html   html模板\n+ test         测试文件\n  add.js     测试文件\npackage.json   包配置文件\n.tuarc         tua配置文件\n```\n#### 2.1.2. 自动下载\n在生成package.json后，npm包的自动安装会启动。优先使用yarn安装，如果没有安装则会选择npm。\n\n### 2.2. 生成DLL文件\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua -d\n``` \n此命令无需手动执行，在使用 `-s` 或 `-p` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n```shell\ntua -s\n```\n启动一个webpack-dev-server，带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n默认情况下，webpack-dev-server 提供一个 express 的服务器，在这里，额外提供对 koa 服务器的支持，只需在此命令的末尾添加 `koa`,\n```shell\ntua -s koa\n```\n以上命令会启动Koa服务器。\n\n### 2.4. 打包\n#### 2.4.1. 打包到本地\n```shell\ntua -p\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包到服务器\n```shell\ntua -p toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用CDN或者html和资源部署到不同路径的情况。\n\n### 2.5. 启动测试\n```shell\ntua -t\n```\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua --run {filename}\n```\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n   默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n   用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. pretty {Boolean | Object}\n是否在启动 webpack 时，使用[prettier](https://github.com/prettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pageEntrys {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n /**\n * @param params 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua -s ?params, 或者 tua -p toserver?param / tua -p ?params\n * @returns {Array}\n *     uri: {String} 访问路径，用于 server.mfs 获取唯一的页面模板。为了解决htmlsrc相同的问题，优先使用router作为map的key，不存在使用htmlsrc\n*      htmlout: {String} 生成后的html文件的路径，相对于 {dist} 路径\n*      htmlsrc: {String} 源html文件模板路径，相对于项目根路径\n*      inlineSource: {reg string}, // 内嵌除dll文件外的符合正则规则的文件到页面中\n*      jssrc: {Array} html文件对应的js入口文件地址, 必须是数组\n*      jsout: {String} html对应的js或css打包后的块名称，只是名称，所有模块打包后 script 会放到 {dist}/scripts/ 下\n*                      css会放到 {dist}/styles/ 下\n* }\n*/\npageEntrys: function (params) {\n    return [{\n        uri: '',\n        htmlsrc: '',\n        inlineSource: '.css|js', // embed all javascript and css inline\n        htmlout: '',\n        jssrc: [''],\n        jsout: ''\n    }];\n}\n```\n参数 函数接受一个参数，可以在 `-s` 或 `-p` 阶段，用 `?xxx` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. src {String}\n代码source路径，缩小loader的处理范围。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    uri: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `-s` 后，启动服务器成功后浏览器打开地址。\n\n** 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准 **\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527\n}\n```\n可设置proxy和端口号。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dllchunk {Object}\n配置dll块，至少配置一个，否则会出错。\n如：\n```js\n{\n    vendor: ['./src/lib/utils'],\n    // vendor2: ['./lib/kEvent']\n}\n```\n\n### 3.18. serverEntry\nserverEntry 应该是一个 Object 类型的值，是指服务端 webpack 入口文件\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n```\n* serverEntry 值存在时，debug阶段会自动启动后台服务，提供server对象给入口文件\n* 不存在时，同以前开发纯前端输出的形式\n\n#### 3.18.1. 入口\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n ```js\n module.exports=function(server){\n    \n}\n ``` \n 或者 es6 模式\n  ```js\n  export default (server)=>{\n     \n }\n  ``` \n  \n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n打包后，会生成 `dist/server/index.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `-s` 或 `-p` 后添加 `?{param}` 来添加\n```shell\ntua -s ?xxx\ntua -p ?xxx\ntua -p toserver?xxx\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua -p toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`-s` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua -s koa\n\ntua -s ?xxx koa\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 ` {Array<string> | string} `。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```\n#### 4.2.2. 区分测试和发布阶段的配置\n 一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```\n### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令 \n```shell\ntua --run start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 __tua.js__ 中的配置，生成 __dll__ 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntrys` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\n  serve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。** \n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","gitHead":"ff1b5661652515ffdc6b0861721137e59043a058","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.9.2","_npmVersion":"6.0.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-nBcTmbiyMkLZtuplsjHYy88dCSeaRwYta0aFaXDGfQEICaF+sU/uz/FI73rbZ/QUb0TRcM9zvcW0J33qeLX41Q==","shasum":"689b2a130316b1dc0df12527ecc0a263a15b6298","tarball":"https://registry.npmjs.org/tua/-/tua-0.9.2.tgz","fileCount":60,"unpackedSize":237953,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/Ty/CRA9TVsSAnZWagAA9nYP/3cmvxUs1KNbU3vcicf3\nlYmtEr8S4+c67Q0mcAAhtaIbL9Y4eXxL8KQZZGei7WAS5nNm6zxTFAiHy8Sk\n1N6R15eRvykJHwMZo9q8da+WU30ZM8V3lJJG8cYia2oOb62RI5MomiS/deqZ\n/c8DSt6tvcr8zC9T8NmYmJ05R8nd5DNb8whsQeAfkdQctuNoIuhdRNdY/hI0\nR+LxuuUa/o2SK4WTT0dDW9+7gxvILOCQeZSTPYKn2s5laI1PaNKeLSSRI3UC\ntJbN77l/MhxXePh5zogbrXCXq1fr20ScLBDcZ0oEGDMdUMXG27zK1JgdnGn7\nQZagU5q5ndJCD5iDL3gO7kGFhlYTAYsbX/cHetsA/m2uO2yDtfjMwecfjl8d\nuxAlqZMpQai0wevgXF0SsTjUQwRQy/RX6Lqn/bVBC7cletZcZuV8ZXomCflI\nXdQGlbZm2diXy/hONGS2ASFx7DDhQVY0rd6OSHRfZ//ia1IvIYNllcYlLB/W\nXbfU1aKjxXj+uB8OcF01vBDNvxxs8/W9ku8XvvBbW08ayjntlob9KmiEelYv\nwVFQg2EJNbMekQag3/ATsHZUvayvNaXBu3SM+5ofqUbecC7tryiL956JRt6j\n6ubqdEpduLwOrbhXZyIl02LXKXHWgshrxg/cdlvMNqV+J7ntON/1D0XPOq3V\n3UtG\r\n=BT/3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCjEcmrWLC6leeCC1UzHJyZ6OMepYScl/szTgpTvpMU4QIgcS7lY85qXEt2axY5RLAaMLRhIvmIdNgwovjDpmfRgPU="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.9.2_1526545598917_0.2346547612532035"},"_hasShrinkwrap":false},"0.8.38":{"name":"tua","version":"0.8.38","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escape-string-regexp":"^1.0.5","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"^2.0.1","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","slash":"^2.0.0","source-map-support":"^0.5.3","source-map-url":"^0.4.0","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"b19b4117f656d291c12eb8c06150bbc8633ed0ba","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.38","_npmVersion":"6.0.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-75LE+YwjCOlv14QgpUh/xPvyq9yz93b9cBn3v6KUJbzf8tS5GpR97tW3lm/mc9lEVY26cBa+UKNysolU1OHYtg==","shasum":"8f904fb37c36748224a7facb699ee2f3ed0f255f","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.38.tgz","fileCount":59,"unpackedSize":233854,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDhdICRA9TVsSAnZWagAAitMP/RWD8B4HK6cRQCgFdKLj\nB3w3NMzCSgpXZuqoYGdaDorLIMiP7+pQmGVyw2kSk6++h6Fw0XSjo/BrKJz0\nwTjuBRt8CyULzso982wubr44/A3i/HxJd1wgBG9aHjU3ppHoz4Ff+VRYl5gK\naMVMtfOR9OKw72iUbpaUQhaAs9/nZlUpWLfrLn2MY6dSuNeUUaZP9hEuTaqV\noQFplAaTIJ9gQxjXeMfHwiyW76CqsclD5CiZ2wBG0MuJ8aaQp/dJKtqN48Xw\nLN4BcQtN6SF+bbOhV1ILbUEW7VZvEasdmjK4fgZL1hrl5QOKVee6PFwVZPIO\n2ntASQthgGYGGLHFyEWEsWg7NQ7WuuX9Ua+sbPzOwdp/oFuAHGAL27Ppz0Zi\nLQD89a5/01Ujvr9gCdFyDrb0qW+2gvG8bNyxq/9YEEp7YnZO6pQ3Zb95ZYKL\nxTo7gJC2MYf5moejMGiuS16xTd56Dke2qcMpjTGXfC9IeSDrkP0byHx1RF31\nLnAHuAnZ5pWSf3r5jH79ufMrGG5zkk1cw+hRFZmlRvOy28B+WCKeJupI1icp\n5hua+RguAkNmBo7O3l7j1DkJru1ZwC8evyx+FT5fLJYdbKevXCdxLPxksXmC\nxeMJ3D8b7kzu6kwQWHjNoggGQmkQIpG88Kqf7SmSSJ/feX/p+OGchIio71IG\nsrNH\r\n=NkCA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5Il3xtZctiHp5Qfr0UQuOYQSGjVsTICpdPE7GfBJLLQIhAPg7c2LY5guxygZixSJ2YFzDOyk1m0JpSvKCvRD5xF41"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.38_1527650118846_0.5841667413823868"},"_hasShrinkwrap":false},"0.8.39":{"name":"tua","version":"0.8.39","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","chunk-manifest-webpack-plugin":"1.1.0","css-loader":"^0.28.7","duplicate-package-checker-webpack-plugin":"^1.2.6","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escape-string-regexp":"^1.0.5","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"^2.0.1","inline-chunk-manifest-html-webpack-plugin":"^2.0.0","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","slash":"^2.0.0","source-map-support":"^0.5.3","source-map-url":"^0.4.0","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"5ea1e1b1409df886f5eb8781191e3f8afc8d49b9","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.39","_npmVersion":"6.0.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-Dn3FE78eET15CaqbZH90Ji4vNOTEkO+UZY1nLRSY2G/GI1Whua6mH1ShwfRVFT4kWbeCJ4/Z8tjU5OlQ7wfM9A==","shasum":"d958d140fed3c44bd11c4ad0c15846a073423534","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.39.tgz","fileCount":59,"unpackedSize":233874,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbFoqZCRA9TVsSAnZWagAAaW4P/ifj524FCnGXi+h1BFMB\nDhAmvpH0pYcY7fI5sM4kyjWw2aHO7yQWWDGVjAf/DeIZsHYWQOnEviITXaes\niyRAIBWd3r87CmjHya9ToRj1cAT6AxtMFNMJ1Q3gPIGNhjHcLapHp6j8sPaZ\nZiB0eQoTvEgr8RZJg0CX1FBZqBwBi3y4IZ3rFJaINciWqjSPnOo7pESyfJmO\nunyNtNGNISUj9m9IWw0hCEHnRpeqbHQP8qyV5cxdZYTXikI/N4UwAGHwgYHs\nsje82tiPrX5wjOvSlBt2FBgWiGR8ObLvL/WL7D4QJ91AaZDC9UoRezW/rvx3\n4eBsya5UJLrDPou3apFRDw8eIGA0fnAHLhZSZ0B79CBke/vureAZMKioWRsh\nLvmwnwVE/vj1+eE6uDupwc9Rhgr+/HjAYBEGo1FGRMCM51mDKursQEt51M/J\nFK2WLYO0wDVJZ34zaaYINFs0DhG+3rgzRPbtJzOJxz6ceoHPUEG0sHNPcHYP\nBXQYxL7mxOcaxzOTENWZyT/3rC4no8PvwWgLGabaj2Pq/NTLZ6eYctpTmbFJ\ncDeFuTaKUrFdX33xVe04qQ8+4cuc0eanV4zW8MVqa+K6zV8Hb128bi5pWxAa\nHWxWuFZk0w8uouGNNR6E2JB6t1DB5S8dGfkiaAW9kYLuPlTB6zfvPxCCF8I2\n/gtq\r\n=OYqP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICcn0R0LRNtZ0OtJOyW/amxmM3o43WZ8uYtpGEVyTvtlAiA/SslV1bw5odU6F8wXspfuGyNCe/kALvZEIfjhr2TvNA=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.39_1528203928248_0.8965597424158558"},"_hasShrinkwrap":false},"0.8.40":{"name":"tua","version":"0.8.40","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","css-loader":"^0.28.7","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escape-string-regexp":"^1.0.5","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"^2.0.1","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","slash":"^2.0.0","source-map-support":"^0.5.3","source-map-url":"^0.4.0","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"59a5ba52f4ba1d2fd704d129eb2294a3ebb490a2","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.40","_npmVersion":"6.3.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-GS04tPvgKOfj6xoDlI37a00JVHFxy2tNHJsSZCTInjJgTdLsgC8lY4fIHIHYsSONWDhEx8ms7E97lP83+W1jgQ==","shasum":"75ca3bb7178ba83ebe2c50d12b8658a13ce03fa0","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.40.tgz","fileCount":61,"unpackedSize":243441,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbpwEYCRA9TVsSAnZWagAAm8UP/iFZ0tG+uKoyA8ql+n5B\nNEsGEMGkEWTJ/0gLnf0yoiSuy5E2ESaP3diSlDM3tMqKc5GjwYK0yZ7HdE3I\nHtrWZSf/olFu7zrW+AtrhddAHcPbY5vk8k4lBENaKZqw8zRTfTXDcygUpQQJ\nEc3212LWmap/jFs2d46DtJFk8KeEk1/9BN0EafWwaviRgQOhvV2P+vBDbVy+\nJG6McAlhPaV+Yjs1fuXJyDRqiepnfWabMGUYu5MxRBulx+Jx2sHfW9CC7m6y\nVwc8ALya+OShjcjsBVomVtmZXHusRp28KaSvFBQC9AXnijqfUVzXNAl9oGP/\nfxkA/DwMijjNLQIRfoe7fPYkuHSMpvFlHtsb/oOoVUXf5+TbtbLQ/cNElYit\npVmjurkNA73j5NiHfWUDRwM3CvZCUW7/3lzUtGgoL6nI5P8hJ25joMTcVsov\nVn066lc7bnxcn3zdkjWrDqOgvYWG2UDMG5PNDVXHq2eKqcjGhua0B/oifwgo\nbrLBiYhdImFQdLkOoPT9cHv1v4H/0qJ3C5BXSeGUvhRB3/u4Nsyc16J11R7K\nLq2b+Hdwl1oOdOY/9GLk97dgP0znJvYIr5YzA+rsufzhzliG3fukHQM07ikv\nciy8FOB6/KzdGDaNvA73U+nkkzrcsvG17G1FjdRmVLpjNej5Ffd/iuTt7Nyx\n3205\r\n=G1Bj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDlCQt8WTRXngHx5B9A6LFVHZFOaDfAo7nIOA/FiqOHBgIgOmLFl9uYQwWoB/BczuOO05w0JpxLpkDAUKH3+JX8kFU="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.40_1537671447317_0.3063466035639506"},"_hasShrinkwrap":false},"0.9.3":{"name":"tua","version":"0.9.3","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib && cp -R src/add/templates lib/add/templates","pub":"npm run build && npm publish && rm -rf lib","pub-next":"npm run build && npm publish --tag next && rm -rf lib","cov":"open coverage/lcov-report/index.html","tdd":"cross-env NODE_ENV=test jest --watch","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"jest":{"bail":true,"collectCoverage":true,"testEnvironment":"node","setupFiles":[],"testPathIgnorePatterns":["/src"],"coveragePathIgnorePatterns":["package.json","package-lock.json"]},"eslintIgnore":["src/add/templates"],"dependencies":{"@vue/cli-init":"^3.0.2","assets-webpack-plugin":"^3.8.4","autoprefixer":"^8.3.0","babel-core":"^6.26.0","babel-loader":"^7.1.5","babel-plugin-minify-dead-code-elimination":"^0.3.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-runtime":"^6.23.0","babel-polyfill":"^6.26.0","babel-preset-env":"^1.7.0","babel-preset-stage-0":"^6.24.1","cache-loader":"^1.2.2","chai":"^4.1.2","colors":"^1.3.1","css-loader":"^0.28.11","escape-string-regexp":"^1.0.5","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","html-webpack-plugin":"^3.2.0","http-server":"^0.11.1","img-loader":"^2.0.1","inquirer-fuzzy-path":"^1.0.0","karma":"^2.0.2","karma-babel-preprocessor":"^7.0.0","karma-chai":"^0.1.0","karma-chrome-launcher":"^2.2.0","karma-mocha":"^1.3.0","karma-mocha-reporter":"^2.2.5","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.7","karma-webpack":"^3.0.0","koa":"^2.5.2","koa-connect":"^2.0.1","koa-router":"^7.4.0","koa-static":"^4.0.3","less":"^3.8.0","less-loader":"^4.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.4.0","mocha":"^5.1.1","node-sass":"^4.9.2","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^4.0.0","ora":"^2.0.0","postcss-loader":"^2.1.6","postcss-smart-import":"^0.7.6","precss":"^3.1.2","prettier":"^1.14.0","prettier-webpack-plugin":"^1.0.0","sass-loader":"^6.0.7","shelljs":"^0.8.2","sinon":"^4.5.0","sinon-chai":"^3.0.0","slash":"^2.0.0","source-map-support":"^0.5.6","source-map-url":"^0.4.0","style-loader":"^0.20.3","thread-loader":"^1.2.0","treeify":"^1.1.0","uglify-js":"^3.4.6","uglifyjs-webpack-plugin":"^1.2.5","url-loader":"^1.0.1","webpack":"^4.16.0","webpack-bundle-analyzer":"^2.13.1","webpack-dev-middleware":"^3.1.2","webpack-dev-server":"3.1.5","webpack-merge":"^4.1.3","yargs":"^11.1.0"},"devDependencies":{"babel-cli":"^6.26.0","cross-env":"^5.2.0","jest":"^23.6.0","metro-memory-fs":"^0.45.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"754b4f8cd1a04b9bf28ff105ffeee0c5731405a6","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.9.3","_npmVersion":"6.3.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-PPQ/j2c48tDKAqe5izhsKB95p3ZtvYNcLOC3gXU7AlYiggGQLDnwjYLTD8wIsjfUBjTbwl5CyqRCxUStA/EG1g==","shasum":"b163fb5c1a53a5a3cd6740089883a1116596d07f","tarball":"https://registry.npmjs.org/tua/-/tua-0.9.3.tgz","fileCount":92,"unpackedSize":345372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbp0DtCRA9TVsSAnZWagAAyYIP/A4TDGwnO/9Rdj1CmDww\nz1IkAvadL7PDpe7yjQXtq6FuXYIaYDyJGCHMKmmKnU7cXoCSEyxSyFVvSXv7\n0PofyscKLlveYIZNO288B8ZI9JxW5DSMtqYxmsJ4UZvWs7ikbBMjiiBQXR0X\nFbWCW1EzN427qGNH00VlmyadZa/f2cjYRs9ACg9SRQFSPM+ISjhs5vBTFZ4m\nEw652kqiCGLs2Yu4GddvzviYGonHagFQ/1/fIODkmJAG640xlrnGK7Brv3io\nvgQK57uFEFGpec8Pny0XPrG2yjts7W2OCsf1cF0MmSgyP2dJCVJ1M6S2cegz\nguw27msPDKy56KcQvj/pEY73QYP+lTr0mRb2WkBVY2Q5Z5kESQ+Sdm0rx9MV\nnQG2kRgiE8JJto9rsvOmY7YNMIBNivpgMTgwKk+T07b/rBG3WQ2EeO4YeZ2L\nPSBCqyT1A0LxhXKr5oghuNR6/1RFtmBC1Mmqwh5rhCH1xlW9VsI5MzCgvCXC\nO+2dZu+SiheFgUoVTQU48ph4fWgQSESDkMPZ4Q1Qmba7HMxWBCBvU340DjAE\nQljkmoxKyqpYdvtGmNzcft7TTEXf2fTqAO/AVc9FEuRb2bx0aWy3AZuxtg45\nEXaxdyQxBVnccOq7R9COthdYS789HNN4/71ypnM2cDKlzXJ0BswtJV/UUHSv\naTO8\r\n=iyqf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBllOdm/wZBMpu2aeWlK1bSK6JZjeMZi2uzIq9aZTXo9AiAXDWp/4cCsxgzDZUzNUp//7O7d0W7NtMkxKF/qW3m8jg=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.9.3_1537687788723_0.6038072231853453"},"_hasShrinkwrap":false},"0.8.41":{"name":"tua","version":"0.8.41","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","css-loader":"^0.28.7","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escape-string-regexp":"^1.0.5","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"^2.0.1","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","slash":"^2.0.0","source-map-support":"^0.5.3","source-map-url":"^0.4.0","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"567d3629ed9b05a3d81126829da2ee536652a774","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.41","_npmVersion":"6.3.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-pJVFuGRl4pVF3NDfdhRed6vWTu/+zPn89W9ZvrvMtjCwdOO1bzL0dUnH0BadL9QVSzUL+ShOl+wfggP0qgDrbg==","shasum":"c49ece6167f52823ff5c83a5ec8eaba9fba06513","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.41.tgz","fileCount":61,"unpackedSize":244058,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvGbaCRA9TVsSAnZWagAA/RUP/3PrmbClEUnjry7SbRzy\nskIPcHk1jGS0ibHiK3fpo3q/S26uBbcgixSVLAcvD9eSH1e/04IMphrfb0lW\naM6JuW7rBZ84CxtISzINqOWxpXZorilVP9W8nn5AibZUKS5IqaBux/b9iip4\n5EZAk3B51BVam/kbHFh8du8Hj79CalR53yG8hAHCXPXmHbhN57Yo/3Ah649t\nIE5dveSOcPIaBzJitLgXGSH7gbUO96Zxoowd5MyWYMaMSvUeB1QYd3Uct5hv\nTheMLygxaZZlmveUJMhdkPgKWicxMqMERGUPHmc1xofzbvnMaxPt5NaTHiTX\n52OQLzeQkM3syn6n4chSmIVCCHmmloFG2i22fLiCqJjS1wFQJ5gjy9icsf19\n5h8dLav3gSoAP2vTuR4u8Qxdwq8JiiKc6U0m0956JoIBo6F8k7/+JoMvjy3F\nnkA0lJcil2vQm96O56to83e+vYWGf4RgoJUtEbTSR+RpzLvC62BzWPkdNjsM\njdJKghIml/7Vvsu63GOEPFMG/uzbXf4sOT1+SESmg1F3pQkBh48VbrDunwYs\n5ufBkaILluMg/20yp1Pj3qgtHMg6RSFP3wmmqf9/58d6w5h7xgZ0ja8MD6A7\n2AS6bua0zDfwM3NaY+T4iETRYvmbOpdOuVpszilqrsfZqB/qe7rSBmthfn6W\n7Hbe\r\n=qJup\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBlyeKXyoYEJOSrxAu+tGdUxVLA2YkR5OimF+X2IB4zNAiBYJcZeEr42Y2w2GtPwZ0ioLR4H3p3gRKJrmF8BES0LCA=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.41_1539073753617_0.2856046644879646"},"_hasShrinkwrap":false},"0.8.42":{"name":"tua","version":"0.8.42","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","css-loader":"^0.28.7","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escape-string-regexp":"^1.0.5","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"^2.0.1","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","slash":"^2.0.0","source-map-support":"^0.5.3","source-map-url":"^0.4.0","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"567d3629ed9b05a3d81126829da2ee536652a774","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.42","_npmVersion":"6.3.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-rYMBMGAaqt/AEIKLIYXZjrYoQhQALPFwVJ+8RpyPA6r2fwDCGx8Zuw3SGIw8BFkiraLog4wK9mTqig1SUNlFyw==","shasum":"2a09d3b65a49c62d64cf81427d43d971b9dbad20","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.42.tgz","fileCount":61,"unpackedSize":243849,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb6SjMCRA9TVsSAnZWagAAk+MP/Ro7rPz21soL3S0fWm/X\n1HSd8bPWtIvVbfUYRF+1rW48EbCX8wTKpACG804SJzPaB8L0BRj0912TfIGP\nA7MqMBW0rqULvufedT32HEutMlfyHkFWEs7MjKKmK9u1aCT8g/yeI4woJ9Nr\nWkFrhLQprVNtksgAdDboRrXT8a5iZJ0CpctLTE0pYzv49Ji3IAaPF2xIhBqq\nCAbcWllQIRcOiDrB5SGxjYfeSvOkaN/leRYmXBD4Rx2BgLdx7BgMzQ+bCjHG\n3z5Uz4cW0d7cPOYc7mvfGQqjsnP9YRi2RWTlS0/70Dl8jrC7Erg0rDmpwJa5\nADKZsLb/9a6nRauzlwoy4EL3tEI6gGBb3yRa9gQQuuI0DW57tuERzZ+7iETX\nsLar2BSBRIQVBd42Ym3wel5GrKYmVshNgurZC71gvA5pemFDIzZhd4kiQ5YG\nYfKPzlb9TIkKwdhv8xQ76qVPoOXvIXzL98zjhpI5psu/gptdJ6n3lV1w6rWh\ngNV0b5G3fHshSw8wi9z9SdoqHHJkZX4JQmLO+GXyqPBOSd3vLwSjH1xXedUd\nEouB9MeMjvkaWD+gohRUsB1On4t1TP8jfkwMfsLmOlg4px+v3Qoa19/EvjWP\nUzK91TAp+3MPTL7/FWFhOkRUEn/xgm5sjUbEc5Jl8DRkp3SgMkhnFTwJGmjD\njrHQ\r\n=H5Nr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDfxZisHopSrUowUX3gmP3PHn31nPFCiKFsUcDqahFjrAiEA7HSojrxTFdTidLnwD8M/QKKQc3ihOokSw8vBs+6/xDE="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.42_1542006987712_0.33797362577683154"},"_hasShrinkwrap":false},"0.8.43":{"name":"tua","version":"0.8.43","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"latest","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","css-loader":"^0.28.7","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escape-string-regexp":"^1.0.5","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"latest","img-loader":"^2.0.1","karma":"^1.7.1","karma-babel-preprocessor":"^7.0.0","karma-chai":"latest","karma-chrome-launcher":"latest","karma-mocha":"latest","karma-mocha-reporter":"^2.2.5","karma-sinon":"latest","karma-sourcemap-loader":"latest","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","node-sass":"^4.7.2","opn":"^5.1.0","ora":"latest","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"latest","shelljs":"latest","sinon":"^2.4.1","sinon-chai":"^2.14.0","slash":"^2.0.0","source-map-support":"^0.5.3","source-map-url":"^0.4.0","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"a6aab6142bf6d9ff04523a514106c312d1254cf7","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.43","_npmVersion":"6.3.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-GvI7PG9w+fPJOfLXZDhDPSuFHR3gVtjJJ0tEfHpOMBxm12ysv19Qnv8YgNPEreC3lhZ/WEJpWvqi916V7EBPYQ==","shasum":"850c62ee26420e198553be16faaa4f3cfa07c9e1","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.43.tgz","fileCount":62,"unpackedSize":244644,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb9oELCRA9TVsSAnZWagAAxjwP/1Ob18m869AYGE+ZVQuY\nHTfOIbrYIChG6Zp+mpujzLMx8aVo6vqA87KUnGklGfHSGyBvCLRBvK1LOgL1\nAh+GM/qImWJUNj1nGHc1ANXHKb4TLB9mi5M0ORodTwrdsrykusMbG2SZge6e\nflvD7DqNx6ATDGM9bz/dti8orK8EMMgoOImIRu9DZmVMhocaulPOrJyQsc33\nAu1INditT75kUZHqzSqMd/mdkeT0B0GZ8u7h9veR4BqiAHzg2YaFKrMZhf/i\nTeRnbGaKCQyJZdWLXycz6ZL42d9p40/zNxGAnNKMt2JOBGE2JJDjjFFdVnlU\nNtjZr5ISpwTJEci74E6UoX/CkKj2HqGX55UIQM+0NzcnpPdvcJrhZp94B3oK\niE6IMAwVedYreQMdZtSBMGw9mvzNSbEnfwkqkDnC97l1YTqnM76SfjMo5NYH\nb7FpWqMHsYVb0aPNa124hTMqBgqZ0nE9ZOrHowRMPvk7vkRcXOClptO8O3D8\nxENj0U4aNIF1jUPlzI8lxeI9ceD4bN6wELtBg1qHfdGYg20Gdty8kFIecYFf\n5EVJisUswCnXGD3yIASJq84JQiDKkX59zY05cgXBy/Xcj8EhU8yDJFr7hozs\ntYYMfeSdupD2D/cHu08oFdKr6seaAp6jpN/OCj3Quxx4paLv7kWmv1B81xiX\nSW7L\r\n=Jl/Y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGBK3Ra69KyXL+Z/LTiO0+qi1aVFtafuCWwEPjpdKqkRAiEAxoyVe7PINsNuxIef5GLRc5GE+ztBHtwJfeKeg/o4yzc="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.43_1542881546194_0.06415402936458592"},"_hasShrinkwrap":false},"0.8.44":{"name":"tua","version":"0.8.44","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"dependencies":{"assets-webpack-plugin":"^3.8.4","autoprefixer":"^7.2.3","babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-plugin-minify-dead-code-elimination":"^0.2.0","babel-plugin-syntax-dynamic-import":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-es5-property-mutators":"latest","babel-plugin-transform-runtime":"latest","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-0":"latest","cache-loader":"^1.2.0","chai":"^4.1.2","css-loader":"^0.28.7","dart-sass":"^1.17.3","es3ify-webpack-plugin":"latest","es5-shim":"^4.5.10","escape-string-regexp":"^1.0.5","escodegen":"^1.9.0","esprima":"^4.0.0","estraverse":"^4.2.0","extract-text-webpack-plugin":"^3.0.2","fibers":"^3.1.1","file-loader":"^1.1.6","html-webpack-plugin":"^2.30.1","http-server":"^0.11.1","img-loader":"^2.0.1","karma":"^2.0.2","karma-babel-preprocessor":"^7.0.0","karma-chai":"^0.1.0","karma-chrome-launcher":"^2.2.0","karma-mocha":"^1.3.0","karma-mocha-reporter":"^2.2.5","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.7","karma-webpack":"^2.0.9","koa":"^2.4.1","koa-connect":"^2.0.0","koa-router":"^7.3.0","koa-static":"^4.0.2","less":"^3.0.0-pre.4","less-loader":"^4.0.5","memory-fs":"^0.4.1","mocha":"^4.0.0","opn":"^5.1.0","ora":"^2.0.0","postcss-loader":"^2.0.9","postcss-smart-import":"^0.7.6","precss":"^2.0.0","prettier":"^1.11.1","prettier-webpack-plugin":"^0.2.2","sass-loader":"^6.0.7","shelljs":"^0.8.2","sinon":"^2.4.1","sinon-chai":"^2.14.0","slash":"^2.0.0","source-map-support":"^0.5.3","source-map-url":"^0.4.0","style-loader":"^0.19.1","thread-loader":"^1.1.2","uglify-js":"^3.2.2","url-loader":"^0.6.2","webpack":"^3.10.0","webpack-bundle-analyzer":"^2.9.1","webpack-dev-middleware":"^1.12.2","webpack-dev-server":"^2.9.7","webpack-merge":"^4.1.1","yargs":"^8.0.2"},"devDependencies":{"babel-cli":"^6.26.0"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish && rm -rf lib","test":"mocha --compilers js:babel-core/register","webpack-defaults":"webpack-defaults"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"491c0fba160c0661d074f3ea004fcb84fcad63e9","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.8.44","_npmVersion":"6.3.0","_nodeVersion":"8.9.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-gHOGeYFwTE1tmfc/mLgMC0Ct7vYWhoFJpq7oInjL/aGk1eMnG4n3XrjI7UPysRCstgiVlmr1YAxAjVcmKRdwYQ==","shasum":"0e9d9ae70a336563e6312ae7629cde7a341909ed","tarball":"https://registry.npmjs.org/tua/-/tua-0.8.44.tgz","fileCount":61,"unpackedSize":245032,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJckatWCRA9TVsSAnZWagAAI4QP/2k8DTBrLCrzit8Lp6WS\nv4JNqNPG9lr7El32hnsX6BQDGlbsV4+nwWa+jxSo3hdWplBKBFbLJlxQHeFw\nWmRBAB1yFySkSJfAcLQrvJymTJ68b4lE4byEoFug2G/8HwaTYRfjqkoqrdA2\nyV7LctqMC+5IHHEwbaPuF2C6V1X59jKEMUWSaR5IknPRMG87V0pQYdPxIzGA\n/+9s9GRQPeCL7Ajcxt9i/MkH2dgi4R/Es9+2v0vBANGOf5+xb3TcY+HWYhOt\nNIyzyBRnXszMuSXnP/KLiqPHFMe9brEWF/MVVcyYU18kVh9MC72BsPwnAj18\nozbuLjXudcOqojeI6fqjACHa90Sc+v9NIf/JTHvZxW3Nv4tiU7v50h5v29vl\n3JadVyHslHlO71ieUHSjXrDdieha8p+jNfhiu+o8BWbWyuMZgO+/mcavGwQK\nyHfHJZMmkFdSa0OiZMrTJy616dNdVpI3kC0o5hby6lwP3+o9T0Ql8r8smVa0\nli4wYKvzjXE/TtVdDFtirPcxhCqIdld4SOvVDAwApTsjfdedEYjEUlPQCyfI\nEH49cbe4uUDV+SqHi1SdCeRniaESlPCINqkyrxTQXZPF9jKMJmta1nKSgysX\nD5T48yFVZ/9oBier574TRABcZnqcQ+Z4xA/0QMUSLDIBUj5vrYKRHqxBRz4+\njqYP\r\n=4gFH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEMCIDu6csP9wZ1ooJ6BASBLS2kyMkEsIDXgfn1tF3HJIZAiAh8Upl0DBBDQuxbd5ZLPjZHUpabN8TH8Sh2tWZMEZxGL"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.8.44_1553050453496_0.8999658705079701"},"_hasShrinkwrap":false},"0.10.0-rc.0":{"name":"tua","version":"0.10.0-rc.0","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.1","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"0e846de75f2b33068513750857da4aa8c69fe8f0","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pageEntries 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pageEntries`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pageEntries 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pageEntries`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n0. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pageEntrys {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @returns {Array}\n * {\n *      uri: {String} 访问路径，用于 server.mfs 获取唯一的页面模板。为了解决htmlsrc相同的问题，优先使用router作为map的key，\n *      不存在使用htmlsrc\n *      htmlout: {String} 生成后的html文件的路径，相对于 {dist} 路径\n *      inlineSource: {reg string}, // 内嵌除dll文件外的符合正则规则的文件到页面中\n *      htmlsrc: {String} 源html文件模板路径，相对于项目根路径\n *      jssrc: {Array} html文件对应的js入口文件地址, 必须是数组\n *      jsout: {String} html对应的js或css打包后的块名称，只是名称，所有模块打包后 script 会放到 {dist}/scripts/ 下\n *                      css会放到 {dist}/styles/ 下\n * }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n * 注意，为了可读性，以下属性配置相等，对应关系如下，自行设置 chunks 请注意 common 和 manifest 模块\n *\n      filename: data.htmlout,\n      template: data.htmlsrc, //html模板路径\n      inlineSource: data.inlineSource,\n      chunks: ['common', 'manifest', data.jsout],\n */\npageEntries: function (param) {\n    return [{\n        uri: '',\n        htmlsrc: '',\n        inlineSource: '.css|js', // embed all javascript and css inline\n        htmlout: '',\n        jssrc: [''],\n        jsout: ''\n    }];\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. src {String}  Deprecated\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527\n}\n```\n可设置proxy和端口号。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dllchunk {Object}\n配置dll块，至少配置一个，否则会出错。\n如：\n```js\n{\n    vendor: ['./src/lib/utils'],\n    // vendor2: ['./lib/kEvent']\n}\n```\n\n### 3.18. serverEntry\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n```js\nmodule.exports=function(server){\n\n}\n```\n或者 es6 模式\n```js\nexport default (server)=>{\n\n}\n```\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n打包后，会生成 `dist/server/index.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.0","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-ElzegQfs1PIlP6DKf7k2OciL1FktlUU90mNfZlYrRl/jYvIKB8dlWT0V9LHVBXkrmOuLmLN2g1EFkr+XyJzTMw==","shasum":"f4659232ce31b2c4c2ef4e44a3e094c08b26b190","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.0.tgz","fileCount":96,"unpackedSize":1941745,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQTbMCRA9TVsSAnZWagAAS7cP+QEbbfDkuHi1LOjHxsUp\n5eeUMZx4ctYwDhAxe6W/bMzk85iqHu2rh6S+UqAD1GPdMnBWB9pSiAMQWCk3\n1o1FagvkW5kz5LtpaEsVYYYS+YTV6bNnSGqZw8y6rq7BDRWBR7YzUBMRticR\nkkTT7hACmarvp5CUJupQnjVCl6h6S7RDcjG9Z9D6FFz2Fk55m2OQqWm63H/k\nn6HG+TH1EaS9ZtOAoDt+1qAi4WJ+RjFLFVVze0Fho8/Og17U+l2w9KYOD8Ua\n7jMPg3Ej/mqMa3lntvGucE2bLiHf/tLRrrrF99sO4eCfOd5Kv5s+Z7joXlCN\n1TsinO5oj4+QC7D69rZsHn2o5RHz+x7ONJ2l0IkpYugIjCPmBSavUQfdZfTv\nhh0XxGuk4WnQW0urnoz7oxr8z/GaHkOVzrVksQrIQ97rH4h7yPxylGsWeEoP\nEw8z5YRjuWd4rgXzPHJaBK3EhOodl023daJSpdHvagqIRqoHyXcTujgLlz05\ngzKCsVDQFpMx9UIBNv4NsP1fqpKsSYX0JkbgP75iyqWCHFy3v+YSkoh8CBrU\nf5qmR0bajyIXlQTUhAR5ATa7iMU+qNcWUsisq1fpIQ1ZuZwsn3rvzT4Hhqt4\nYdOZTNqpPcOb1bvu6eKVBQjhCZWQMucsotxz3sSlEO48W4yZJuMoM2oNeLVG\ntCuQ\r\n=/glP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIANLMnFVPT0ZS+yB6eP/MBOoqzt6tkQucJIEI26fNN+dAiBkbwicUFo2auxUY0gsQ7IZHjvYZv1N4xp9xjrKsuJSbw=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.0_1564554956061_0.5683238780762987"},"_hasShrinkwrap":false},"0.10.0-rc.1":{"name":"tua","version":"0.10.0-rc.1","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.1","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"9f4e4c9c1dc2e93c6d5b30cb576606889145bf89","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com'\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块，以及是否使用polyfill\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n    usePolyfill: false\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.1","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-X2ykLZTreIoBbQYbVULJeVDjlU4uxV24YkN0FLWBaZYEAZuSPX0gSczvDW6LbZiss+mo5gn/9e+ppQ+rrAHN4g==","shasum":"c9c17038cd27b0a66e39071b2e3a2df7cca810fd","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.1.tgz","fileCount":96,"unpackedSize":1947599,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQlz4CRA9TVsSAnZWagAAdzMP+wYGMaPXHRtLz4ghFr+D\n7gzHTqEauPobfFaks0KL/vmkvaAscde6J2IVdbzg7vGQZi4w1R6lDd5E4W0Z\nw54tvyWjiLKI/pyze/rmrdEgZMDPB73eWxTMlBk2OZ7in5uVnxN2sNSHbquR\ng0yBi1rMC/sNm3h1hgqroiB+Nv6Z/y/luNbiJz740qN+89CCX+tuF+NXMxgD\nU6J7K3ai/FyOLDHoLVIyCiqWQHsvMJ/h6Sq7i0WN5QhxIR8y6Nogr+i4JBW2\neifTSbGLtU8Ikiz+CfXeIpq6hh6jYyddVk6qAXmqIu2WhbgpJDPPtCofGc0f\nHqprKL5Wf61hbJXnmQ3f8cGyq7a/KuXNcCAESgX5qKuqJdoj2AOFc+1KX5Ws\n+AfFFhQ/RnacU+zh2mFH5OhChjli9snk7NLDP8GJWDh5B7nVSF0QF52oWBQs\nID8oaFdGlcVHmqGXVgFGDIKtKX+kVvdeWP9qxPy2p+uIWWXaIgwVtm/8z6nd\nn+CTvrJtHCo+7FWNJrEu97kfpBlESL4vMHYG7xDFJc5lHwkmEbG+4pr88Cvu\nfbJMj3I8aL0c7GkT/GfPg5CmZVdq5GMtLunomd98tIQOqc3LGjwv25V2yYeu\nsQJO6MJn8afr8INniEuhaf9cWtnoO4VYFqw8odrP8gvpwH2sGJLefzwM8bkZ\ndjjU\r\n=HdWb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDbqmBnpQ2EApoHOr9raE43zCXxucwNHK/aEOozCGzyRAiEA0I9l66nAqM1Xec7s52tQjZegm6J+R3oplEO2hJTQHjk="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.1_1564630263945_0.41292245693144825"},"_hasShrinkwrap":false},"0.10.0-rc.2":{"name":"tua","version":"0.10.0-rc.2","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.1","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"9f4e4c9c1dc2e93c6d5b30cb576606889145bf89","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com'\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块，以及是否使用polyfill\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n    usePolyfill: false\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.2","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-oR4JYzErQfePhxHGg5tM2a15z+6lDiTy9okPkLfWDo4lpReoZZIzElAnzAqsXa7QOd0opxlyuDRukaM1f3P8tw==","shasum":"d2a4ee81ece4a829e33bda6d134d2ed9e2bb4907","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.2.tgz","fileCount":98,"unpackedSize":1947682,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQl/iCRA9TVsSAnZWagAAQeoP/2o9rp63Do53OvFy9LdN\nFwItVEZkzRgnVGMmAatZvGEwE7712VgwAl7Z80O+QyHNUQKmVUGgMvVgoCT7\nkKfED3ZTH+ifxo5Da0y+izhWsMZBiUyVgZoi/xdATi0z6xxRvTNzjmjkx8wO\nAo0m0SrfWDq7SHySWoyLCfrFIp0jL8zGOu3YAuqvjjqm8Y5nwwLla7tzRWtx\n3z5D20TTmeMnyPXrfb/TCKWrire9HkJOLmUTY6pG+oguAxlkYCrc/Q/NjL/i\nak0Oe9iPXhMyDaCC8/BnR8uo8G+XfPUrtac8EUUpf/3MaQqVAgAdTzUzgQyM\nwfva+03YJw01qFrjpkOFQXsJUzdqKRYToLda1qOygGpvfo/XacXN+pdpE0K4\nZPrxgrSHptWH6THLiHaZCNns45drtcZiWoQX9I9Bt0i4j5k7DXVyzRNtCjsI\nDzdrjqlRHUOWQAlmTsGKE6WIRsCgDHhby5BIUG6lDd98/7eiqDKlmkfkgSn0\nYZJHAxRTkyNDg8Gsopqhbkw11dGDieKL9bsLwyeqSWrwF7pWhuMNh9oRkJTl\nlfJecvzqyc/ALSgMprWfWDLXMhq/Gtko30WYx92hKLEfzL/J7PQT5sTi9BZ0\nCUKdR4TYHMHIa39LS+dIT28DCHwHXV0BJSHYPTU8W+ufKjkpfr7m9BgvQqHx\npCRV\r\n=zFDp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCfVNjKhvqRRU9WbLI2diQ2Q9IbRilqQf66lOUrdNlU4QIhAOk8Gr14GKE55mG2cJTgAxDddAb9YzrtBHQs22rMIgPA"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.2_1564631009520_0.6114476497229409"},"_hasShrinkwrap":false},"0.10.0-rc.3":{"name":"tua","version":"0.10.0-rc.3","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"56258e29586c053015fe85b24165eb8b9c49807d","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com'\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块，以及是否使用polyfill\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n    usePolyfill: false\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.3","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-chZ+Uy+DzYoqpaMUv3bf8MWyGz04v90a3Bm2+tc2JU2DIKRmw611wmHVBStuvNGHGKjIPaYyeKnA0G1Kh9IA2g==","shasum":"9c9086c98d3a381da335fdb85a1e9095e1d68c03","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.3.tgz","fileCount":98,"unpackedSize":1948021,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQpCKCRA9TVsSAnZWagAAukkP/Ruo9DeLVaOUMxIGPuzr\nSD37Ukx9Z4GnPAoVgvKz0Fe2J6mUqWdsR+dYO2I+XLEPTSZ3grxE8IqyV3O+\nf1nn6v5CkUz2gpv/J3lS9g+Y96MZwAwzrgfHg1jGeqpmLhN5Bo6VbtAb7iU3\nOySAGHteLdCHHV+VNw53qq/E2MGdSVV5L8MAhEXgZAEAgbSiBvZSKUq39/yG\nAMSQuH3v7ZFSRXOs5B+RAJWQPO4bcV66dYrUTyAGhr902sUzVzcGHMnkSyUK\nWruK24CMS7+Dc4fwo1E2j2y7nWgxhHJ4dbTP7Y3I086JHfC6UIAeIVQKbq4j\nOyrPhU0gdRtX4hIc3biqtw7+gGTQNMcN7nX2di8svsWSN+u3+9n+AyOE2WBq\nr/50UVP3sutue2xU7s+WuCnjDOHsZ9AEJXaOtYsUv0d/Fi+qXdTHp2ky3WNu\nUvgyrhad8+eISNlo53/9maUJ0HsnxTYSJudQO4exl6fK6VeOonLb1twxlgkE\njusltdo+AH7ll7ADmeIK+YOC2Izr6ChC7TUd4ZSR2vru1DWtMQ7JhsLfWJH6\nO6b6/vpI4sBz0zT0x6U/jNpOpKM85AbxMXgbYLZQ6lvInnZt/sTqHaiVqHkO\npPKidEH7oD8fmWst68AOFwqz2mECi8D80tf6drkKnZVMaL/IuEB32JEhU6Nm\nWIu3\r\n=WJx+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDkg4tXJlCOhluL/D7hrPMR/lpMaYwjtaWtZumIGB1OmwIgQPBPjL5VNNGbu0RxtgqBlkGzILSDSta9qikZ0/n0NH0="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.3_1564643465593_0.5157903091466445"},"_hasShrinkwrap":false},"0.10.0-rc.4":{"name":"tua","version":"0.10.0-rc.4","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"d0793736886c381826d3714fa466970dc9acf4c7","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块，以及是否使用polyfill\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n    usePolyfill: false\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.4","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-snYz9zUeFde7q5hWW171M9ITls8mAGgDHGOU9/guadJZb9RME93WrraQVSmkhjSoAIWiZ6I1nn5pg3pIEB00UA==","shasum":"63b6376652d13f9f3109a7b02ade518fea5dc79a","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.4.tgz","fileCount":98,"unpackedSize":1950072,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQqSwCRA9TVsSAnZWagAAoXsQAKLz98YIa9siS2XOG+a6\nhZuR92947GPOBO5zjhBgDtJx1exTtm40KZtaobVogEzLl9tmT3lx7jTVLXcA\nKbMa+rafrcXr57TIBL8Jpy2lPB+xDqrhiA+BnpFObr+Yb/rhLvdLPWjxcsGB\nDzBNBCqeJjBGk8HTQt0VPuz1iuBdH55nqfvCGMgzy+tKxDBtihtFZ6xRauae\nfjuoEHa+QUx/EU11tpfGbdf9LNwlGXeTGbpVIpNfiEAiDK5gWIF1lsRgCHwQ\nIwEZML97idDw8qI4llYIlabAxwwVOFmVIOXP5GbgOdeGgHKKILBVdvfRlH2f\nLJsQXlY3My1VVG5mlM5+pdYOzFXZluMjcMPqlfbx4yIS1K9wdk+o3F2YfGR/\n+hHBHJq7TV2K5RmCea5fm9gZZIiJKHvT+vq0fssCPP/GNRtzvlb5sFaaiKeB\nAlpnn0cKwCHuXFSeljGii9Oxh83KqbtxXT6cf9ZGEqt5ri4wJWTEuJJMYsi/\nIsTdy+o/EaXGbjZyW7I5B7J8Ot2AvKkK+lyDXYrc8+6bPiqW2nujbIO6G8Iu\n6kkMM/59m+Hh2kk6MVCLwk1ygZDDmQOsW1uc57tJgi4HNjVGUxqDDzkP/hrZ\n+/4W7ClZ3EZRBSnfv2W+IMyBq6tWyaXZ4fogFT91Hjt79IuZZTqeDVjWw+Mo\ntoiI\r\n=qsy9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5qUXBZnO/3F76QL9M+kzxbd59h1cFkuX1UZQMQOkeqgIhANvGmC7ij3Gisdew+L1G7kqyDEGX9kKbEIp3QvyornGZ"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.4_1564648623374_0.43211147102042946"},"_hasShrinkwrap":false},"0.10.0-rc.5":{"name":"tua","version":"0.10.0-rc.5","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"d0793736886c381826d3714fa466970dc9acf4c7","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块，以及是否使用polyfill\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n    usePolyfill: false\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.5","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-wWRUvWBD651GR/R+38NbCJ/JnKofJZRSnfvC1LJwNCPVqS60uOgpIMc6xR4Zt7dLqlA/68XxPow2l2ONTHCMzg==","shasum":"1f7dd912281a714a5c8b3deb6e5de63f3ad13dd1","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.5.tgz","fileCount":98,"unpackedSize":1950072,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQqcSCRA9TVsSAnZWagAAnisP/20kV6JyMBkc2lyds+kv\nQ/iWDh/JEOoW0swo3CyInK4ramjbRDArIP65RiBxjbIQBjjdk+6iCTQhNc0N\n3TopvmHV8bgsuBnTYRCLr8oeoJLH56DhaY6WBLu2e9ZJ58rz+mGyKiDl71AF\nY092cXE9JUhtoLSBPvkb2cpcHos2/yeQlLZ1Igvpxe4SdI7tJt3aaNSRTlQV\nldE6EuagAxtArnHeljtCKLkVRC7e0m630jpdX5RBiuM+skwiIF77Cu0UoPdv\nEdyzBJ6d9+AAiChE6rLEZ5edGV5KOwVXs2HOuBAlYt5RqEGiVoIQ5btTrBj0\nKfePR+TfhPtkgwj+g//nqEFlYhUvTuO/dvNZ10eLbaHRraNAMinKutypbodq\nhUcqKEuXYaUA8gbMJRbldwRgxZ1QjEyNfKAHdYDAEI3i76GCVsttKeQ+6rzZ\nIfSl8J75ulB9UwB2kuGZ1YjfPctmL3y1mF98Nn4o6igWr52qK0LAzHFc/y2b\nbNeHeNmv4d3evs+ux3joWNOmqO8W3hbEkoSZ6ELJPORgGRbTqbA+UFllJ1hD\nlbBmU1rbc58/BXSgmn5HZcp5EsEU+/YxjvtZdhxRxRCAjsdneAOx78OuER1q\nX4+CitSbvKSy7KdGwszBOtRM1tHY6OPNPDiVZ584SioepjiJHe4osiOJx3Vb\n3sj8\r\n=2jg4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDxKH9Y6DTYdDmPq87ihukj2UgD3be6dQHLVJKFY9KeLAIhALVQgoVpyclTfGTh6tPoFh7e6Ng2dRW6QHYdPfzQ6+zq"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.5_1564649233797_0.7272970121701021"},"_hasShrinkwrap":false},"0.10.0-rc.6":{"name":"tua","version":"0.10.0-rc.6","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"238f3a5a4847d7f99eecbd335fad004d82f3fa48","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块，以及是否使用polyfill\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n    usePolyfill: false\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.6","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-wSxGQArJEa1hZFA08wyNP6nuRcqBvIb/K1D3hYIOl40zwU/366AL7Uv3tCJyuQggl0LCmJFYEmg5OTuHenCkoQ==","shasum":"aef3a40eab71029a9034b08e5d8a4cfaeb8c9b21","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.6.tgz","fileCount":98,"unpackedSize":1950060,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQrlwCRA9TVsSAnZWagAAHowP/jTrkPTi19lmSNlxeotJ\nL9B+RLQBGoc3q81uLkCEHo/0x11ZgtcSmKpab3km/NPQTnVPlEJug28PQkns\nccwNeTOgPEGOQ1cyJNU87FZHeQOvD99ThPOXroFaYa9oacKtt18tRZlBTMOj\n1Pd4biOop9nbCe2gQE0+Ov6g7M3inwFBLUKrv5AXyN0tgFAMEmZ6WAOVxU9S\nv8uNj4yd8oxXNJrEbPKr6DWIOwuA4Gujx9robwIIVIQuqMmD8zgG77C4yYRZ\n45t1iIcL5wYlq96roVC5/aMZDIe7kYnMCc5+ShkdmRziT++aPQYVoOsi/bQY\nGlIslm2Gw5cUCBfwjy7PLAfjvnQZpM6igOXvsLOGPYi1oQlaW6r5Iv2ZJh/P\ntddSk9SyjvA4HXlCWCzToImnHDvFpsDACGZO4BA7soM65UbAad1G70GLo87W\nElig79osa5Sr9+QX4XA9Gtn1CbKumG2XhHYCLZICdnSTUHKE97mYKtsyUnAd\n7GEVp/v+loWAJspgF8tRgfw2AdlTzlFDZiHqAwjZt3VvoXv+rEpLGBLZGxgS\nxFu+VXW+n4LHV2131Hh/FE/tJlEgH7bdHC2r9fOYGBHw/3O8pxOk0zLDZRZz\nCTquNt4juCtI0v5z6s104AWkDmA8a6rzqFYLFHUrLZp/8eGPNJaA43CN0Rfv\nfJ+d\r\n=hbYN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDi2Rxv+cKpIWnecPqoUUoKvvQVCJFWrkjoWseDutjWTgIhAMk2D3ceN1kEiamYbLY2iUtght0gGMgtclbPWFwKmI5T"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.6_1564653935866_0.5159807727540178"},"_hasShrinkwrap":false},"0.10.0-rc.7":{"name":"tua","version":"0.10.0-rc.7","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"9d4b097eabec95ccf95ab13b26dd7671154a6513","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块，以及是否使用polyfill\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n    usePolyfill: false\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.7","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-5mzuU1w/A2oFTAN4ovc76EORdf0f8AglME+X8eQr2TfwL4I02zAfXT//LwU2ZHpV75YZAv2/sGTuTtQwMRDYMQ==","shasum":"f2ccdf7d907cc38ffddbd748bfdb6ddaf979e923","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.7.tgz","fileCount":62,"unpackedSize":565969,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQtqaCRA9TVsSAnZWagAASV8P/1bMAxK89L1MdZcij6bc\nFWzBuxIe+gSIBAqJFego3egUzCihPhBglm1zPNdW9AkEujYDMeS57HfdKNmJ\nbPdvj5MOgQUlUdQu2O8vidWtj0qy688Xx2p4cgpTU771V8F+ArNmnjuqYnNY\nSR99MB7jiUmY6DPaon7/dCFCU+mh1kXa2PhObXVvSTu7gH5A0L4C1qNjQJ/B\nP37qnQ/bfNBBnknvgR3vL27BnRaHRSmJD7eKkZAUUfhkZMSvBfrCrMdGK0G3\nqHCsGHYJmXCI9Esj7N254rwxOtM9lrxOK1BVVrzRwySX66XlzD12pl753pRD\nbKAnuYPamAcmiZEgEXx32SCvWVSC2QtwWDZAyog/mZHJhVe4lfvOK1NjXzMY\n+B/uIau1N+00G/+CFFxo9jlri8KXwg4yYvou9drzydHZ+rDK9xruJvR0VoeQ\nmNxPaNypn7Obrxtlmey8XCw/OsqhEl0Yr8hlB8KC99T4sTCuq9qc8yx0MtDU\nFg8zLFgC+c9j8xf/J+cZm6+2j/WBjilaL+sub/jwZexpKFS3aAH74PUjEuml\niuvczxhyFDOhV4z7F1hS3qpgWip41n8QyiljyikpzlYN0oAtTlaN5U2Wm1Hc\nLJ0Bc1hPRqx37TZ/elkowVZXpjoXOZssObA7Ar2C64crCTTmb0UECUgpPAOo\nSg1x\r\n=oCDm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD9inp21s01tFy3K9uKChjiRY88FGfhLKP+ehCCDT0PTAIhAPOHMhZ/uBsQzL/8gVI50hETtLuqEruCWX5Ypl7FL7w7"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.7_1564662426161_0.581867282992502"},"_hasShrinkwrap":false},"0.10.0-rc.9":{"name":"tua","version":"0.10.0-rc.9","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"5f544aa95104392fc525c6a3c3bc64a959ed21dc","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块，以及是否使用polyfill\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n    usePolyfill: false\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.9","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-zbMRfXrL5/hRVRyQ1yG93w+mPAksRxCXTWR0OZEcrLbvpjR1fL00ClM0gTI0lCk5M0GWSgfAAJGp2q/aGfu0PA==","shasum":"576a36ab25e8c0b0bd67bbe0057fa1b04709b752","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.9.tgz","fileCount":62,"unpackedSize":567133,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQxZ7CRA9TVsSAnZWagAAn10P/3R2UdijmaBHoqrXiMBY\n3MFifX2ZaOFyPiYQHQd21EqV4CxXDT05dx4h7BsqpvnzXU7ASyZKi+12KOSv\nei7J3H5h//zTw0VaGJt3d9+fIKCTrLexR9gqrHHRMZPenYDdPhOPQ7Zd4rzL\nkMjWU6aI7iVX3CymKg7xjm6wAi6l6bnAiZMK+n85I4DbFfm1vgBwrJRXxcF3\nohrOOlXZLJGiACNkIdma7BJWQ08ek82nrD8MThaI7J6eVPhDYo8sNsbb0BpH\ngqE6LKlvLp3060i2yNPvZP1P0fP1n3tWON+1kJhfmI3tmP2RTOf1dp57pTC8\nif9aqaqIGE/PG6H5MujD36U1rJqkLeAXX2hNT9FPn8+btgr21yAjnDGjG27f\nb6/80ILPvtFvG0d784jTCMhk45WVx5REcnYyQ7/ZeKrmOVp1oUYHDR+PISVV\n77Qu/9oh5Oax0KW2qH1r3c4RcoPrbYrzTIiOxJ+RaWId8AmLszkBhAcpWjgT\nxI2t7XDYSuqhebMFEnei/j9xgZ/iWUfRRoR8Q9acNmWRGxH4OyWknJqhKf9k\n8oWL/z9tvFsZN2tuQFwOh1lG6l+wUTmg/5s4HuWFKRh6Zk0PRJirTzPvoUrO\nOfeMhM0kGE0gOvhJV7i0w+WaqBqjAfKfipIuf6zp20uii/9mPeCs46i1Wyj3\nK8sc\r\n=eIPl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCeRsVuuSsEBY3rrPU70nH4bHF4POGmBh/o4fymuy1VQAIgVISmtliJif+Aija1UN9AwQ8+K5f56Rd3QHmoU5Pqj+w="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.9_1564677754900_0.8179112017446966"},"_hasShrinkwrap":false},"0.10.0-rc.10":{"name":"tua","version":"0.10.0-rc.10","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"9b6d621d118bfe112ee85f59942487219e75a05e","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块，以及是否使用polyfill\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n    usePolyfill: false\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.10","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-fjspZkcpNy3cwpwmaU5a2q0uFtXXhqdU7t9eggmkRtKuDYbmUpr3o5fxPlHYjkhtJINIpXnrEwf0ukyJTCEC0Q==","shasum":"2a3ed26f0478d42961456679ba2dd07d591f9852","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.10.tgz","fileCount":64,"unpackedSize":659345,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQ8h1CRA9TVsSAnZWagAAOi4P/i5qupvgKT8bAvOMh1Cf\n+oLs0AZ+8tsa/hkIM3/01Yl0OBaPYbf2MI17UiqpcEPhac8EakGf3E4joP3b\nTKsXCeZZyVoICiryGbfzCeujtf7JttiUbImWiI1D4/aKGxqDAivmX841dSpa\nTkYc8v2FE7JnyRF75+xNaAQnj0x3n+a5gtJw9uhzBX5wtNFlbKQDKnInMcdi\nOXLvwUOmealHb3hTBGmaaxzpE2DDZP4MEjKnkgkDHlZTYyeccNF0vx3cjNUS\nPJGv6nXgrZT5Cg3ELpeWRY3P/QZ5Lg4yNXC9D3rQca+qLSkbrt0RWHMjYHsO\n1Gty4DDs4374r84TOLDMljFMz7mTd4DQRu7PMTLkRAGRMXYv0TwgS5S+lOvb\n3d9qbhUYbKM2RZCq+Mv/CycPAqVEEpDP3JmUiRGHhvhEe3DWvh9NgQWFE3Nj\ncCQVy38Xx4L0WqiT3atHNPvwS65AmM5iUettq2D989mK1hZn9DFaRxKcb3ZD\nxoPZ+5x63hNqdFvxo73EJN8LjLtpjifKsvwMfQDOyafq6GDeN2BuS8D1mCcI\n2aAu0HIVunjXcudGRYf/6r/W8xks67/dWUfS4/enpj/z7ctnl2SKaaox/oxa\nd1AwuQS2SZ1NYUpuiF/xofkSI5VSvTlj6LJWc7fi0wFc53dkV8NR1hTcbcZH\n7EuM\r\n=e5ZS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC34Er0sH5nk5MiptUH5Rs+EPmhBHrQb+IubQJ1dndXQQIgLpQdOdo46iCAbcMKwvBSgouyf+X5XjUYyrg0SGQUdhM="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.10_1564723316403_0.47505009778353613"},"_hasShrinkwrap":false},"0.10.0-rc.11":{"name":"tua","version":"0.10.0-rc.11","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"a9eef108bc80a7eb74166be2da23697cd95ef2be","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块，以及是否使用polyfill\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n    usePolyfill: false\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.11","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-eWXmhVABP8fnRqUUAp+9dLQJUELBlwVSPMWFkNlK6BkB9WKtSx24DomyMjAcK1Kpf0otcX2swGSxWSzWshPzmg==","shasum":"e6df6a4e4181312164be880a58a9de433cf25843","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.11.tgz","fileCount":64,"unpackedSize":633603,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQ9I2CRA9TVsSAnZWagAAi+UP/0sq/m00YKP3+RN/d7Rm\nrbhlbuzNQPdepjlOS8fJpQ4VtDKgsIWCNpNyr4gLA7gmhe2700TIeJ26sByN\nEPtBpe/GjBlvWTNF1I7d4eA++nALPYnYqz/bvQ625TKR3tp5veVaxOh8l2jf\nGbeNFZ8G1WNHmRWTdBW39JeI4z9+iqyqE64hDAp2ikiO/HA/t5mbLO2fb3ps\nUExRYNkGuB1EsvoHI9qgzOknwnsVn8vn2FLiLBz53tk9hYifY2SVdNNiw25+\nrXwIE37elXbGuDTGWcCglBH/VT+h9HvMHLTDdkNeWKDdctmZZo1SQGp3BkxL\n9o1Hiz+1+aC0ieG/40n7lFro7h2iXSCfgciH4t4KDLBtq4kmeDKZpdZl+Y8q\nGfPZldlKmBSjCxTp43oBnJnB0x3AWSv+kqCb8TFaSY5rkrc4j5h9p7mSoaWG\nkYAOF+5j9xAiJ8b9hrGMoaaxfuX6C6zV+4EJRIoD3kR9QbQ7OUB6cGhpeQ8d\nCzojh2t8TEPyAiIzA91U+Dg3h6b2wZ6lflCKVCECQHAYMNVwI94LHxQaQSB8\n7OiKyPZfPwhRsvtXUEfTWa8T8jyk40mFUN3KLd6CwGcqZN+VDrj9xoDXAFlM\nm4vBOQp5VxWC9CzGUUfQVDDDxsFAvzfog6Ji45sCdpOjIHtykYXXzd8LJKDJ\nvxWn\r\n=uRtx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCrPGx5m6lFu2VyW3XPIhuycJNXkcDUMwm/6FSrVwK0BAIgR0iYYpdisEyWvs8SYv8lbGo0TsJqR6WzcQGj29nWNaA="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.11_1564725813830_0.35915546875676974"},"_hasShrinkwrap":false},"0.10.0-rc.12":{"name":"tua","version":"0.10.0-rc.12","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"df48c6dfe3d783241f5aed94dd01a21add4fa019","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块，以及是否使用polyfill\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n    usePolyfill: false\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.12","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-+aYLakoOcUDtEygnMWNjuprHSqqk6aiZKT/txw9XyXyZd46NDA3BlD/6Ck99S9VUzLfVjONCaXPHJBSJOZgUsA==","shasum":"4db2b1629f1d067b07dd9c6ee323d3ba523c447a","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.12.tgz","fileCount":62,"unpackedSize":578108,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRRrsCRA9TVsSAnZWagAAN3IP/1f+Xk1VB7rMkZ1KIS7x\nc63+WdjqDmm8RRZQ3ULidKCi/5WDOPiMkm+s+m3M0qA8VvPyPEnlrqLxqGO+\nWumVCVKgr3T4udiNVB8K2LoeS6VTWpkjyv9BrXWsTTghgFHziM4xYBAUFZLq\nxUwdi/Fr2og0t4zDpihEU0GhAEKNQUywKX5eJHbBZT00XldNX0d0wBJhIoHk\n8uN8BrDa21EI6iyDI45J8gXH3iWIYyMQyBG8QsTDuk2QiqhtfGAEztdZ5AKt\nTbJ23pb00WcDB7w/JnCneXhzhE7dUo1LG7pSj+OT/JshqNV+tvFxlXAhYH71\n2KPzItEyeByiUipVm8JKp2TaqoRb/lMBETfO7qewSfKNV5UMxwbDk8P0WjB7\nfC9bC1Oa73M8cjc61dk5KydFFImi+qb9xE6fTeQais44S8wpBsHvE5RP6J1b\nSDyZWpLalYnhQiHIRKOq0JfoEWYKt1oRJG7rsfhn9dYxjz1ITnprqZ2Zg9my\nSgMIdw8uOMoRakUtr+8wiM3CTffIfXVsFylgpuGLILL35vS/XXWYNjErV/fQ\nGd5uNOoG/qgjojgBtqqkd5lMS+8L5imd+jhvTQKXWHCeiiA2/4EIRrN/q+Sv\nAVONvq5VzYF7yzt9f0tM2XzrsDJa5PojIK2VpFa+nqK7/xEXryIhrjpfs786\nMmTF\r\n=HTqb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDO/brOuK0dHBtjJAfHWQIVmYn/24QrV+4yUAeTZISpYAiBEHpTo+ChI+rre2yT76M+MzPZNJLzz8InpkGRLt5+B1A=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.12_1564809963083_0.9109076369171962"},"_hasShrinkwrap":false},"0.10.0-rc.13":{"name":"tua","version":"0.10.0-rc.13","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"785e7bd7cd724c5fdfb8567c96a9c394498ad77c","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.13","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-jJ0YrsxdvKuQtGq++31AiweLHHzZKumILviM0xJ5leA5SpX9lwjA5akFl5C7IAXdUlHl8VJ0Gzvhpam+bT/zvQ==","shasum":"22c93f9dc5f8545a1fc6b5991ae789e03db6c182","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.13.tgz","fileCount":62,"unpackedSize":577923,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRTUZCRA9TVsSAnZWagAAHwgP/2OGzjkciPfRiUG560ab\ntoHbWkryqBFJ/XlGuj2+FvL3wet/B+UMDOAz/dCjgvefwVsrXubVIiN3RQC1\n9PpswQunR3+XOyZOlmPypyS/WuzYZWepTMZBgn0lzhU0wWUPqwABE1W+wFaL\nEzYemgbBEi2F/PgLEVp1AUUClGIMhyPlwQPM7mxR4Xlk3Tk842EwGH6PlDhq\n4H3gaAvJ/BzUG/BL5PjMwEC2vb+idFqlNnUYh3PNyu7M6XXk9ca1SrGO2PLw\nuCWQNQcDb6gSuFdKV+cm8W8kKoed1St550jNRIxnXXiwFOrCeHTndU3FX2Nh\n3DvlOdS5VI2QWSG3FyJ5gGptN727YYElbdKsYWW2/hOxFiIOdqlD0JmizfJy\nlWBthm0YGo0kWxTLt4DRM0DZhbvAykUuX482QHoDMHEvw2EygwKZjwQI9hKL\nkSSf6ijgzFxThixTjVDhlTFmwzmrRMo1YD/nsiMXE3Khml7iqBLNjaTqtOg4\nWFrbuHgGJO9P80VRuy+v5inKtPw9vvCI2FKRkxJA0XHw1DeU7jyT7WgXSQDE\nctMMUQYLqiE25WxggJbCdBhTj7avwRGDrbZr6cdSmXo1u7QN5+bfdxT4UXzV\nuo86KkMcD/n6DGbJk3tGdJGy/m1HrguYtg/gG+t0BzAZlDlEhtHdjU+q6cTN\naqf8\r\n=VaQl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDoekhlAt1piqXIwkF6PB77cr99w5OON/1LEW5rX0PLTAiEAjLqPtcZRCSRwJNyJzHA3dQNG15WMmUvXFcQElZgVkf4="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.13_1564816664855_0.09885436534581293"},"_hasShrinkwrap":false},"0.10.0-rc.14":{"name":"tua","version":"0.10.0-rc.14","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"98ca5a3dcd131605bcdbd740ec92d38e86042f29","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.14","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-j3j2Mn9KC/ACGheFMabOjvjGwvndj4+PLqnUJIsPZ3g+is7RrtM7bS1jRRB45ndz56FKfahHkyGPIBxNaG6JrA==","shasum":"b7807cd799ba6b046d8cc8fd7402c48c5d6779de","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.14.tgz","fileCount":63,"unpackedSize":629438,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRcKJCRA9TVsSAnZWagAAY+oQAJf9ZTJ9qv4PRDmK13by\nW7pE5pIuGvHvuYjdcdXyih2WK+WjcaCGkSuGbCJlAqhstzlMFhlQgwhcUvst\nxI/cqtqSzDeKdahv6GzAh6rw7tm4eL6JRuAtXnO6J2gFOG9cLlVX2DqP0Ndi\nsKQrkGKBEocQQjfwH/xntM11YD4iOl/4aKWVMt2bbiw+eEi6PKed0ZudkTnj\ndDzVM1G4/q1kR2770GauaLf47aeM8/IFGx5Od3qiHZQ7qOn6aB38gVCHS9pd\nPdmnCCxgqCJXFKtFJs0x873TU9/pEfIQUh/b9a/VXowRA2yrIhOYP833gjWa\nFmYJ1Gkq3Okq52XZzHIa5IzHvqF2XoXtUNYU7yIvcw+uaoBiPLdFrydX9aLI\nXRq2BAQxbCbE1BHYXYNaGoTTlEe0+sFtwS6UqzrkY3CN12O3f5O4mPic85YY\nZOAJO7vygNDFTiEn/z0KBnVcSVuKlqsnIilEOGHqA6vFzgv8g0tbwz7fAvgS\nkkIAi6AJ9LJJ7VG89bqRxd0VlIGZtqCvB0ypIp1UDMtmPj1DfBzkdFeK3xk2\na3WpKAZXur8U4fB9DZLfGJEMO8NBuQXaQe5mGsTs72RhC8iUMcSr2z8yiHOG\nvt0lSLdzWCgerz+Fjnv57JmuAMVkPRK+j5laMXNsz+ZqN0FXeAuHjWc9Hjbz\nL0R3\r\n=5o5K\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEr1LnT6K0ZPtXnqXjGrkV5He3Ha5NYvwRUtzo1c3Hv+AiEAmPKiSjZ/wgvPOQYEVSm+vyc90/hLCglUiOguonfQDlo="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.14_1564852872293_0.4276954469770289"},"_hasShrinkwrap":false},"0.10.0-rc.15":{"name":"tua","version":"0.10.0-rc.15","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"cf2d2001c2a0372c039a9f1a57d9015c8252c2b0","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.15","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-2E2lOfHB7TXto2tIcLFABRFG/oehBOSX9YmCtPT+WoTdXR62Na+NH9zpa1w3UYpLlauFGj0NsnISnK5zLi7F4Q==","shasum":"6cacdfc3f7f1ecc3adf5c239652fdcf4dbad34f4","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.15.tgz","fileCount":61,"unpackedSize":560565,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRnNTCRA9TVsSAnZWagAAaFYP/RC6l5wynULS2qockFck\nyc7U3XA6fLRRly9O97bfz5TnWujWJnZ8ZqpiJAnWS/XS5Mpo+YmVu4o+5jDP\nCukkoIL80JQVb7BqEkjILU+RbDr9SadTPY6Vj5cJussYfYTC6+0eZ2x2lF9X\nGQxXdXHYoXBoKxE+YmzDP10R97tMJ3co4HsvYdld/dh32FO5Gs6ZoIkIEutv\nMCTPBEZZouFOALIOY2fqetBVzPki7TbvG5blUf4hGnyC2SduQZKX9kgcyRmc\n71sBkjF/AdBcJUjeYNDrY3kK/hJcuq2ehU9KC3iYfNzZLgArlgHMnfsKvDBF\naFxVqab/8Xx0hi7X0UT55apTLSa+K3cPF/qTrjKTJPxkmKwM/8hMQ+WtCWaF\nvuK2Wj27Zdmetzq58MzkazOr59Xv6X2qaxRDnZGPggFw7RGjJv2U3plP+f9/\nzJ7QyKxqBA/Uit5WanVOu5CQjpOc8Xtg9o1Ctq0jdVL8cSGU0KqLBk7JP6ZZ\nqNAKWBFS2eEk5/L5dKKLPzfoAR0VVFQ1WThcwVNX1wW1Zix4fYIA3lkOM33m\nbZSOUEoMacHbZ9TEphlO9jooxeeA5N+aeSmzDC+4KcmOU0QyadATcmOLVsut\nvIopmPRSO5wJdM98uVkORSUCKm6aYOv9zS6+hSaOuEi0+6RFHDlQHXrJBqy4\nAb/B\r\n=McLV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFry8h28dfEssaUddsfDvQprsrWjMOAU2HTKaP6bjVQ3AiAiStQtic7IvujNs4Nex63TDotRXNhZgXe1Z/YmWpxXAQ=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.15_1564898130861_0.6381747474813229"},"_hasShrinkwrap":false},"0.10.0-rc.16":{"name":"tua","version":"0.10.0-rc.16","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"344b1312ed0d1b5254e44a1abac3c5ea1804244f","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.16","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-jMydIsnVBpGz72P/gUV49RYAo6U9iH9imkcdG4L3Bz3rFOh/J1SGfTbhmoPQcXZGfrYgWdvksQ5juAUlqHBtCg==","shasum":"d27c4be03772b7833f5dd56f3333b54c3135347d","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.16.tgz","fileCount":66,"unpackedSize":630621,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRqJVCRA9TVsSAnZWagAAVOAP/AwrzWF4dxCnO3oTBWdm\nqcyWPKqTny6mRm+X7TbTcah4ArpQjmYu94vVtF65BGQrT6SeDq7TFdpIkPok\nJwuAzNGGzY5U73QTQ1wdKbWmIyFOvRi3D5xyR7u2m3cgfGPP+5tTuEU74Qi9\njq+3pCZPOIJswF99PdwQxVrjqpY459uLb4/UxBhegrrLsDeUuvAfOGA5SolV\nKx8BUgu8yiw1MhuvaybJmEy/eSPdbKwPw7OFwgGgOXDZT04eThyE0+tcDqIG\nj6QqZqx64yiiWruFDufZ+yvp931YDG6KpDy0kaOf8HYcgUFiP1RjRpogW2p+\ntpSeTrX2UKJSP9DJ2WStFnbwXrxmY6oSL6I1VEhAltUhSrfeggCX6Guu1rWW\ns1F6dbatISwdQ/nOigHTpCBQVmNZxma+1wVApF5jCibN0cbdcfD3sySuFQl6\nEj5bhsJhr71k7RFJKw79urytiiJovg782ikcHByub2UBk6shkHkt3Vt0spum\n5TdtGg28Jx4sI4MnEKdR31i0rl8SmgPE37UkfeqmepdoS86W7r75hMDzWhbC\nyedJFC7GKTL+vCI/bZAiQWETZNX9AIgs3f1On9+BRZc2vXEauLYW5wCv8bAM\n/O1mTluUrY5ypm+2mgpW9E3r/cr06nwOoufh12XHBpEi/67/Xcu8bDC9v2Kl\nHe+G\r\n=eSkI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICgomIya4ycmKFMUo7SQUC9z63dg+AUjwRikIKurznsrAiEArPBExJOL1d1ee2AdXrsENEsEjT/EHqhrOWoFvBnK2nU="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.16_1564910164307_0.5933841357269753"},"_hasShrinkwrap":false},"0.10.0-rc.17":{"name":"tua","version":"0.10.0-rc.17","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"344b1312ed0d1b5254e44a1abac3c5ea1804244f","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.17","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-lTL3lR+CV7jsBLB5zi7afp0/XROyvJ6O9stcrCw7owHGTBZlOdlY/Q0Vgp7TSwgDAEuLQli0ycOIp2nAAy4+Hg==","shasum":"df39803c90152ab5fd751ae2f064dd31e43eae86","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.17.tgz","fileCount":65,"unpackedSize":569704,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdR5HwCRA9TVsSAnZWagAAbYcP/2TdDLg0NXlUBRdVDnvF\nIojpn0DLv04KfJ/bDDXL0nd3h7n7vTutSf2uRYfM00NCFiMy4eam9o3vmeFb\nP/hXo2jO7mft2gmIDC/P03bTTR0O+5DCbqSn0Xfe/aVSH+L1XpSMkcTTAscR\nKWNJRJqS0oRVAsXjG3tL2Fpn9EPXjA0mnW2dk/T8Ls1c12vvUO4cEAOZA+nR\ngsLs7sEUFljG43+9RmWS/hQfbY7s0oukX/WyasgTj+V6PBnEZXkP0OJDMF7Z\n1SKvk4fSJyzkTP1gNV2WZPzfe0s7tmc3aCHln3B2N/GlmLWWr1sDw+53ytG7\nKCXr1c0cv+nGybJcEk9PQCIB5h8x7/UkW+BBmJQL+wRmdgP4tTWBWMdJYRNN\nblj4C81pQQ664bMpsM4Usdxu1IqQUD+eOVUzj6MecHWwOQaND64kYaw168/Y\nEVAhGK1bFkkOP8rbJqwc8jIPuEJN0M5evLx3vlY1JdYQ5DDzVlSx8/8Z3pTo\nkZk4/FwNoMajSFkgSNcm+MUrbmUTnbs9U/jXk3vZK9/w8t6ECS0A8hdrTsI8\nVeqbwGzBwxn5tvBP5Tac/MAT/+ItyH1s11dwi7qb2EyI3VBcrEwXglmmlRGJ\nuMKnRUQ45cFUuSni8KXc7wtEQDVVA3K914ZWZXaLD11l14RHYrIjZVapkEDp\n+trG\r\n=i0hK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCrkrC8IEjDHowHM0DOGn+PCqOlgEvqtqfRtYd2HaO35AIhAKbeh97Frl4oKsC9VjARoT5iovsFxO3dlR61khDPi6mC"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.17_1564971504218_0.7562871484642817"},"_hasShrinkwrap":false},"0.10.0-rc.18":{"name":"tua","version":"0.10.0-rc.18","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"00ca5915586b7b1ce863ff5f75b8296df2a51951","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.18","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-oKBNAnLIPaJMZzqOkIk5OFuocVhtJI/7ilX+domELm3MHbplzKHOOriZhnQSbxBGcxxfFHXIyBZ6SSwgrc+Ktg==","shasum":"fe1c5884c8d9f4bf36f7a2be1d6853e03ccd055d","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.18.tgz","fileCount":65,"unpackedSize":569785,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdR5euCRA9TVsSAnZWagAAtF0QAI/GBc5Iy/BcORZ1jiz2\nQoJAWjAiQU6KTEgzpp7r6yzk3TDik7IdO2fMBReETao8AiXMCxzrCiksSc/t\nTgoOnHUdAk8QZQpVpYSFd41dRPsWgKp5FKsH+TFn2SrI3xg85uDdFMr1tEwn\ncCNXRA2Mz6p0Rl97djvw3l7ci0I6C3t8jL8J4/tg1idR2ZfoN2voIahhWH47\nK+/TlvD+eVapVQRl2qGLC2u3nKdyhQ0r7cEeZD/4qCQCJ7BiUwHKpwWUm3QF\nhrWQ1WQW/+0omtZbhmLq5q3gOqOPFUk/4Yg/LALRODEVicQu1bjZu29rzS0Y\nPgi5lOqv/IwCBzS7nyWIGnD/DEe9EjNbTlhc5xo58B8A6LCywGD3QnjQ2PkD\ndSwi4MOoOPqz+AAQ7wbev65rSFRSsnto8/Qo/+MKCHrkcsxpiH8MurgiGUCC\nNVPVHqYFPZ1E+pw3re1Kg2bTs8x+pjfYu5KvVu4qNuCp0Pa4MYHg33p7XFwS\nfEBa3Ia5bOaacRpbzN3j2TtAHh+IUQAzB+mTe9/2uuVxxj+B0i+eVt6UVokg\n7MhB5EIEqB+7kp0DytJF26V5mdQ6/oHRXntmr7DqGhkWVw73uWxpxTCz6VCS\nUY2hIDWWnvaSgrVRNDpS8uWgS0oUcjpoTcCGEnXauAFybZBpiyzXBAd8Fx91\njCyH\r\n=stkF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH0muBZLHJGDEr7axTpVleNFfWzfK1hh8zmybwGKjkOlAiEAnXfFzeh/NAz14C39+v082Emb7uiuctrUOyuGjVeFvYs="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.18_1564972973943_0.9615240722406511"},"_hasShrinkwrap":false},"0.10.0-rc.19":{"name":"tua","version":"0.10.0-rc.19","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"1f80142a8dbd2f0cc57109b96d1a72f6f6bf535e","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.19","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-/B+m6TMspeZ6oYNzidyMSvIqSV7Nx6kGdzRwCdk+mMpY/rXIlPrM8/C0c18lXa0t2QwCB7Too7Qzsxh2k6XANA==","shasum":"5332a9c4554556931f08a84ef7793b0527cd5412","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.19.tgz","fileCount":65,"unpackedSize":569945,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdR83RCRA9TVsSAnZWagAA9jsP/R32WAhlagqhtYxeDrvc\nkHc6boLAT8sUDPjDgnekyxg0Scc3G2grMErXPT4d2DLi800HlP/YtkcLBKCM\nMd0oRn8xM+vVnHbWhzm7LAeWE6sCRRdeTXrxapksxsFkKdZTXEHFAmob+ftf\nlLGmf1QdNVvC8JqG0bhviLly/pdo88Ql92KkrlzzTGhWXYj05yacSHYdnXmc\nD7a+OO1DPc22V4xNS2ah1H2LKI7YXmTf9o734fnfhNuiF5r8Sth6dyIGJOms\njXGgoJHWq2LTtee/RNZjxUMjJRdg3Kz/7CxDw7ZQkT29PWujdioMub+HeZyS\nRNl1Lfryku85NYi0zuyUMH0wm8fGMkNxn0Xn5crOYoKT/rxjUyOJkP5GqGfd\nHyZQKxtwH2mauyuMsqEsgBAlFmsS9hDeh2MXac4R2gymMcAPyy8RILclQdl/\niAyxqLxSNJO/MY7MnVsY5cS3GXFiIV981ZdZdlTZ6FlWuH1g6BodRoTyJr+3\nwjwWr9968hzEwF8RguWt47m/kJAzCB2rD5m9PA8k4swJJAnLWejc431tWekv\nM889mGbeeonfAGq0KQPIbiOa5+udmqsQ2hPpY0/UO+sf7HMZvVUxxJm93B3p\nooK40oUgK6BkH/FqCT9HMiNiCgKGAPQo9NZV5Lb5sbVk7Dk8X/zcTywEkzWG\nD76f\r\n=fr3z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDBuoU/SEycx4uFEyDEoLx//ZVEm9RB5nTPwqGdIYZF9QIgFLXw9ZZ4MuAU4X9t0/yK0LjuIxx3nNMdkm5+tH7ePtY="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.19_1564986832539_0.2523641259882037"},"_hasShrinkwrap":false},"0.10.0-rc.20":{"name":"tua","version":"0.10.0-rc.20","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"b117f25ec7b55ab2a0dba3e01488710887ebe052","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.20","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-j9mW6D6nsvQokO6gN4H6oQrSMLLThsZO/h1Om2Fix73nEGNA/G7IKCI9UEa8dJgnR56K5dLlq+2fmWhrnOFV+g==","shasum":"18ee323b4b7f9385bdf7e9cd05d1e5ff363ea60e","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.20.tgz","fileCount":65,"unpackedSize":570189,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdR+D9CRA9TVsSAnZWagAAf9AP/1g7urw5C6St7TEa+ZJC\nPrafXAtR0lqbxzI2C/jo8t5m+gGk7w8nS997+Q1/Z+NbFlHL1NI1vCCL/bAj\n15GCDEo1X9Gh+qQeiV84OYWgMq0BuL15v94B3CCe6uSapveqMVNx6RJTGFLp\nrzTFFaah1HwyeBdqjh2TB8fERqur4VqbnYjgRt+juvaWbq4syj6w+2HrHT+0\nzRc8K9erNkNgrYP/6r1te2vmiIIAv4O9ve+wJhlcxS1iUZ3vZfIStI4LWTzM\ntSIhI7E08j5YHS1uy6eIlC9z+X9YEoWLCa3Fnh1TeVpVOw1qoaBL7eOnS9gm\nOFPTWB/lrdKyvFsbJqo73699Am97DMqYyYkRt6MVBNTcEyEPeNuu/BIX92a+\n4oS7/eoQ53r/DQb0pqGSzw/17AMf35nJWuHjJ8CbG7pPWqt4TLnZbQa+rrad\nUDt+lln42gI98NuFxXzbPEjo65cyOu9T+N26NN/H8RN6exi0CP37Icz53mkJ\nZxxsu3ZJnwPvoLKS+Hp2mGSHFJy3Pa5sV9KQm5ky92q2ikHq74+QJ+dREkQo\n9fUN8ndYBmKAR89rTLfZ+A/A+tTwRcIxMBumYtY9uG9HDgGIOzRfG2M8Mp79\nZlJ85yjloleun+yxK7H8KUNbvF/VCk64LmubPRXP0xrST6T6oYQpMIQvdG4j\ne7zY\r\n=zGIS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCgcm7Ta/xvGTS3jtVPvBuGUSMQ/HsLa8KkHrsdqzd2sgIgYbP77CQ4FMXhLJWE8J161vlROIbbPPEzZ3L7tkKYHeM="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.20_1564991740336_0.06240171444828824"},"_hasShrinkwrap":false},"0.10.0-rc.21":{"name":"tua","version":"0.10.0-rc.21","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"93024dc5196ffecdfafdab94e2eaa4fa477507b9","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.21","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-PXhmwnBR8yIUMfhL74xUGkxWc7ft8K+BPJpsQOfYSUh22dkLsrc1dBwMrhbO+0jRGrShn5PdwJR1dWmks9qfmg==","shasum":"4e82b5eb884e8ce249e505fa136df26630a94f5a","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.21.tgz","fileCount":65,"unpackedSize":570477,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdR+QeCRA9TVsSAnZWagAAdK8P/isuNINAhdrzvEZRWtzd\nIocOHfH4FjGNNkoVGlKicEP2lGr1vvWq9Raom3f/xBY3BEq+/dMqUjnI9+08\n382WvXfGy163bf5NSbCULy1/xY0za7Pu8lvfP3ffrmvz3uB48qEwaRHcZ4Fs\naA5vbuT6GoM2JuwlGamH6TCy+kjETbE2YMZvKs0R42XkpZyFOtUKxiH0sUOv\nAD3PV07OwYQyLyvlL9JPtneME0W/ob7t1GXqZiXThz1wz6/X5+15V96TXCcV\nf2QKbNTL/OYD3aMln1gTgSr/dLgw9CeNZCRHpYgBQWzdTZwixGvtnz/SNPRn\nANLq+ayaXNgcqY9GSOKbpshKW05YkP7Rd4gixgMFEqrUq5tz1XVhltYpZyH7\nXksWwmotdkUG2bGYAchPgqULkfMcWZsrCVbH5LuXV3hJUFhq8eHmMrS2GIGt\nZ4Ynn3uc/MeiWjE5alky+LAgu8jdA6V1X4lZFlFJZ0LNaFb0+TO4etSLnpeP\n40ENuMaKh6WxuGGE3514dib4i/aIGd32zgK2lCIatfPCQHOOi7PFT+6okXSr\nR0eC7MdaiXx1RkkFZyQ5ZbDsTWOL+8s9MknbjLHjeme/eOAyNahVihildQDj\nf2+bFO8UlGBc6kWjrEybOHolTf3aXtLdDXAMIbz8w2t5Z1g47EohbsPDArQM\nP3gr\r\n=FMP3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1SVuUFksh/WTnj2bB3G2q41EOdoFKksjuSwE/7BMs9AIgfiHedp3QvE5iNFRTvsdEUiv/Q79JXbibIa3b9bCa074="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.21_1564992541074_0.20306203841375403"},"_hasShrinkwrap":false},"0.10.0-rc.22":{"name":"tua","version":"0.10.0-rc.22","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"079fdca7e0dbd5d34acebdabc7d88984dd28d64d","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.22","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-/HRK97i56NsvXXcoW3kPvfyKCPDun4FbiGehWqt1mOgDy/bCJ2wFu/o8rP4BUW7JLN1BO0hUx2k1PHsrfpcI+g==","shasum":"143c87c444a5b3ef3086ea402c4f0072b3f17f34","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.22.tgz","fileCount":65,"unpackedSize":570497,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSCVyCRA9TVsSAnZWagAA1EcQAJwQ+ldrjxQlavo9H2ww\nAJjUwkMzDxI8mRvZvDeoL/j++fARoSZcQvX18XVgEmReNehignH95xf5gIn1\nsKUSTJgGGFkzs9YVFDzZ+KuDmAA21ipOAmhBiHJnSz2q3S+N9a7OCgaML/df\nw5Yv9cc5WlCIAsetlebiUaTnTgWrb1nfLdE4LOdwBVzwJiuZTC9rf7J+1mxh\n+bYuDh3G98k41WI+VWRiZqghIHSrxdTUgr//SSHh0xjbCY7kKQySWiaAwTFb\ndXrIye46pMeWkGjqDpNPn8OFWNc+wqp9E+KJSOR5qNLuhzK7HA5iiFhwQqwd\n1iTvbVqnWjTT+v/AxvdNNvz6XqiolmOlXYqZuI3uAbm2OiLWHA8P/9WHDgH7\nxrnJzHGChMWX+hY2RQSnrS75iyEGuiYL5jAaSTxxpLdk3zzJchTo1/2Eheeh\n6wABjhmW/9ZtfUewkabXsqxhrlokjPcFeIGFyfkITRMpl5JuhZ7rO3/oVMu2\nS4MR1W4yoRYC9zZ82wXbBioB4rvXR0OeHvplqHSoZBBbrOjjRil79jbojKP0\n3D99QRKqD46jHAq+xpDoxdBuBBBFLOTaXECvx+zQzgxPAa+/DzZSa5pq+CuF\nMx/9rXWx21BIiPr5TRzibiqj4U7tPp3nvUJfe7SwIb32KjfVgUy3PGpsakSl\n3sXs\r\n=InWt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCcSfyw6v5stm7EWqjeL88uMTMRv2hgdKROTVNc5/mukQIgaM4v/nJ5IPz/seiaGy3VWxPrd7ExY4/aQchVlOdmzYQ="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.22_1565009265549_0.8523714026539604"},"_hasShrinkwrap":false},"0.10.0-rc.23":{"name":"tua","version":"0.10.0-rc.23","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"7245e8af3ac24b0cee2f29a25803cf7cebc15a1b","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.23","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-UcTbRX9Znu2U+8+LQAS6UB3VMYWPvVQsj86MZa6ZEDYXjaXCf9A271erj129kLDKrxG6HCUEq7IzkQloy1n2Fg==","shasum":"a9096a44e5b4fad6a3478b5023fbeb8d33f8599f","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.23.tgz","fileCount":68,"unpackedSize":632947,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSZ+5CRA9TVsSAnZWagAA+HYQAInLvKux1RQgh0vQUK/i\nyOeQFHRRxZOOdHS4XAwqpwahttMZjQ7BUfJDhdFw0ESFXjp6sYam6Y5Nq7AS\ncJ3wusjOPN15MsCdWBPJospbEOGMmXNlU9IFB+a59elzV8qMnTGC6W+cRwtB\nf24D54p7LbH66fOtWC+pTJenvzKbavnOurfwXaw9+vuL1jrreLjIuGD0/BD3\nX66vAe+catN7Y1rUWdoV8RjauPTBriikt3AVejcTxc5HyHScCEj6UxJdp8Kc\nu461j4NCBTH2fF6yAeJS49MNOOLm8q9OwrJyob/Y+dRuf7mJNn49Nit6bRce\nOWCcTw7KMwn+P3NIfsSc+Bk/2NOglz8lQmWIWBx54sILB9fkHUAZAfxhSbX5\nWbrucoym4d1pyyciXQKOSN7ZX5szJ4GI0vCX++BjMmk9XT/lLJj56yk996ZS\n5JUY5YBg3ffhK3XVnbMukOCygmq4DmodIIFYp1TwBTW+iEGwNbMO1vbQ6Jqa\n8O0zy80P2VrAbSPbocID2PMFIJUf0IzF/RXIEECjdljwpkNIuQ+mzYzkSq5Y\nAlDsbv8tT8FRN1VG5rGQd8+x/VOsOATpXBNatUaKoe/cKQcCEaGfHIICvC5V\nRB3i/A927VjplIffc2E2OLdgEd4wV8UNdZgnTBE47q5DiTIkDPCkwXFx5gfJ\nCj8w\r\n=KBez\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDHiEqJlnZKRp+6NSPG6IindL/VQJkP1XA/uhjti5OEZQIhAOnEltYHGNwucaYDIuTpY7Y9R2QlekEQvDCvqr4ooqP4"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.23_1565106105036_0.4077744924128608"},"_hasShrinkwrap":false},"0.10.0-rc.24":{"name":"tua","version":"0.10.0-rc.24","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.2","@tuax/webpack-dev-server":"^1.0.3","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.8.4","cache-loader":"^1.2.5","colors":"^1.3.1","css-loader":"^0.28.11","cssnano":"^4.1.4","escodegen":"^1.11.0","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^1.1.11","fs-extra":"^7.0.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.0.3","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.5.0","opn":"^5.3.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^2.0.0","outdent":"^0.7.0","shelljs":"^0.8.2","source-map-support":"^0.5.12","source-map-url":"^0.4.0","style-loader":"^0.23.1","terser-webpack-plugin":"^1.3.0","thread-loader":"^1.2.0","url-loader":"^1.0.1","webpack":"^4.35.3","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.1.3","webpackbar":"^3.2.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.2","@babel/register":"^7.4.4","lerna":"^3.16.4","metro-memory-fs":"^0.45.2","mocha":"^6.2.0","vuepress":"^1.0.2"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"fb4e277e524efae8844893dd44bbd973fe7b166f","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.24","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-H/Y7k5jdZUPbxYKsfgguKkUp+meVFsXk/Ry+uw3IgyVynE7lw/utqYxUUwErSJpPUYWh7Pd9yU60fez8EHjEhg==","shasum":"28f9742e74fdcc6937744c0d1327e7384e6eb7b2","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.24.tgz","fileCount":62,"unpackedSize":562197,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSmkhCRA9TVsSAnZWagAAv8oQAIDe2bqDUIheUygk73+b\nebsYQaHFXkSAv3WfGKHVgoiUVSHvj+AAwzSZpS9iEI9Gq/ju9qKwKiW6W9Mp\norocCbmXmxtgxQFPoNyAPKKURx1gI5s3tIec5lin6SX9q0MucnVKp/ChlNMj\nCbrKQC1rOfkxGL55CtyqP+Mz9dOJwp3sRU70m8aP1o72Arbnkcv3PimjkAIy\nzlLkT2gUzTykLQCJQlqqVE0nRJ5LKVUVtjJBYV4dpdPuxd5azAnJ3Q9gDBFW\nZUOKT22BkK28p2hEx0EbwKvbvxWW7Wa6GfoOSjyr2or2Ozy1dtsZ4iN2Wbra\nZODOpLyXLg6W4PIaOKPB8s7U92wXRNy5jZTDlYLaZ2TDPtqRxnzF5q51xvH1\nUP35bGP8FvaD7AeM3WRpE0ZuQEM2RsE6oRgwhynvbOwkt+hpW2wLeuomFa4f\nR796ScJI6pzJwmGIDSYAB1slIVx5sXQg+BhmL8jDyRKQl9l+5HEFH36kettM\noxpHKIonNcbngIwN3BibaLe0KMLHS0f6plF6uKu1/aHc7y+WG+WaBwY2xltD\nA5/sDKf8cMeanuKUprht8YaFo3iXfFphAgAQsbhzDKxiNTOdr/FExpN6O136\nYDMkAH2mDdnqJ8C9eBQTwRXCK5+LbdCfqoicrZoilITVRXqhXUmEcHz5i0RG\na4qc\r\n=CnFh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDusZ8BLzG20JV7ykIoqxWf3jO6p7N08MIPHs9QLxYqDwIhAO18ThNAbYUxyW8pJ/FSnUV76OD57nILbOwKmpUlfLy/"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.24_1565157664492_0.772304299525012"},"_hasShrinkwrap":false},"0.10.0-rc.25":{"name":"tua","version":"0.10.0-rc.25","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.6","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0 ","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^3.0.1","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"f9c1d9fb7e8ab0214c9feaf8610d6bc16d3c6d88","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.25","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-I0NCRZDpU0kYOLjFCiTu92xdkaj2aKzFC61fi1H8jG+JYWFS64wl/VTr1gJqGy2WYgKDjXy7hx0r3BARXZBTOg==","shasum":"076573ba2367353654f20ad54e68db5097637798","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.25.tgz","fileCount":62,"unpackedSize":562010,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSpWNCRA9TVsSAnZWagAAsl4P/iFVcfOMlPiXQQ6VoJT1\nElUSA/qLP9un3APe07J9Dq8Pf4rpHPK7wePyVVpjrJmxzzHxbZ2Ex8M8He2B\nbQUXe0mHjAQf6WrpJ7VYecrPFJxWTUEswWpdCCUwLaJmubG3O8sRPO6rFk1Z\ng+MfeQzwHbScNk4ceT2as2M+5tP7gMR3GYO749xSKsItIBfYmNpGUS990JdW\nv6x94JWQzs3dUJAxbcld+VqnJ2kZXFRbYeM91PBKmy8Eq0cmz6slNOAHKeZR\nxdafnkdYVoNWc/ad7ZmFYXGZo4PR4fPGiMb/yIpMAtvn5QBpkpkMaGK99qWf\n7T1NDfjnT9qltGds4fMJUAfG75bsDHmy0EaTk2MqkOjjHJt7zT2yDoqrX1KN\nxH3XztUoPVzPMjyOPHTqDAiSyxrNAYvLpsNlOiYCWAXLioNbYFUCNor5MKm+\nt4Nv1TUaEHuT6+dZrca43CWvrmGbeiF3Wqi/D8NoU2zDkR1Yvh64KX4tUdNN\nbb+uimLkjkVXZuFOCdhSE32VZHqoeS/4RQR8a2PlfdHvD27csaYgh0j4is3p\nyAoLL+qVxnFtVXfC1Ax755evpjOB1stPY/M7R2+35zFWG5/gY+xcvCFipSNq\nkCQcrpqvVcGmulBk46eGwSZgTjs2c4gfumOUPAYG0YVO3Lxe/WdYgDQ8fCi9\ntscW\r\n=osLm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDanpLbkB/u0dTiJHbtBD+awyVJJQKziCbFph4oYB59twIgad2gpdPTbKeDGpM4F5Zn3tImFNEDTxOxb1OiR73xsAY="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.25_1565169035495_0.4519445771734607"},"_hasShrinkwrap":false},"0.10.0-rc.26":{"name":"tua","version":"0.10.0-rc.26","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.6","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0 ","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^3.0.1","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"358b82d3b37c676698d7e0b654409cbdaa53c5b2","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.26","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-Bgbj5VhuqRUFOUFt86rwkCIp57AWH4LtV28q+Uh9VXQAXzXRzmssfUnl9CykE4A4IlRwKrTMlg07XAMc9+IllQ==","shasum":"6ded1b6632be1c974b8f242611b9e364ee33f9b4","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.26.tgz","fileCount":61,"unpackedSize":555761,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSqOQCRA9TVsSAnZWagAA6ZwP/2MlFW2zf/94avML7uRo\nptP+TpjF1XRg7ao0h3WabTtY8AVNfWPhylp9vT98gJZywB79q0zQmDRRkzOv\nIOcUwAFFEr8EEnbRG+QUZ9TdFWRqf/Q/w7ZUvnfZ76xtFf2W9zgo50lV0LLR\noFRQ3c9qD3LhsB1yk2tBK/yG503VS8K3+JkbMqEkZBpPSazsiiiKOQR4UGkP\nAFEAcui+CU493ZnDKWvwZBOhbNc+vBxZR1kN42nu62XuOZW75aGO5JRFM1MH\nHjt3vUT1PBXQYS2wpCj5+Zi1Q12x6ZdrMbsbcSjlGp3nGjKgoeF7VMfSR0gE\nxm3HDrscgBd8CESugc6q3fkYNwkMRyGYFm8NKG9J8D+iO1hCmy0UIrOupMZP\nO6Yvo5EJOrzj+a9vs9CyaEh+Rx/4JIwag3aYAy54i56rXWmXOt9VpKN6eNJN\nSeIfy1kL8Gjx4vPofFY88jioceZxEden2fIfrbNgIRWeoSkWzo24bnQ//Qei\nVOMNXuPZ2seUJEtSbqa9vZwJZnYygPOQwGxliIG3MhjH40gUVGzNZ+2BoMQ8\nGc2d+wPYHTKe0ni09lT96y2HzbID3dRzrkuPo0WTv90IFCAnMoYt88VrzSVx\nEr72njJIFHHw/pws/PrvUja9c3O6AA39hUQz+xXXNamTMysma/fv74j7vXVM\n+a5X\r\n=XrEb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD34ICgdHzIWvpa6xp5+hth1V++S2GBoqIjCiucKUuYNAIhANsuAXnwmG0B16mEIHvpi51rPZ2eXRrqgcK9EzBFC21Z"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.26_1565172623364_0.8499210594876561"},"_hasShrinkwrap":false},"0.10.0-rc.27":{"name":"tua","version":"0.10.0-rc.27","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.6","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0 ","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^3.0.1","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"f9b533a7f068004d36a150ba726c329d9d48c9aa","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.27","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-XhON6US7TKpAsXS8Beayr9Xifd18rcNluGkBU2PMd9xJe064eFKTiDnqY1FQ0dwrqXPFqIOBTm1G9RmSfi1V8Q==","shasum":"dbf7f7530255b9ccce993b5edafbe150b6d49a4c","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.27.tgz","fileCount":61,"unpackedSize":555930,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSsJPCRA9TVsSAnZWagAAV3QP/0CZ7XxAnQRm/ZUxpAM7\nmsWaCLvHHqYZ4dPx8bzFak568blHXdJQq4guTotkMWrtnyjRU/r1j9Q3S6Af\nrixf6jdxJgi4tQdIpmj1Rx9LGsixxwsPPIvHIN9N7FfRcP8tNFJGGERamgdn\nEyKeNEtbwx0vTb26PJp4/i4DdKtldJ5OKj3Bb8JTTpkWaEvPlJdfuiWBYla4\naTZEn3jyv8FPRKyuvsG1PB3LB8uDiAgNX8/tqJOgOYN5K7XlZHMQPtovxY7F\n4bxXSR4vRbiaHOTHtH/gKoDRGLTEtudGM0q7uqrO2vrragT6S6s33Gbi3ijm\n6VvWsglLYSkZKT0Avdr7978yBzwCnDoprjXgbEMVCsQ+7KBuL3WsgKQ7MhCB\n6CkJmQ3PABPnnB1Huzcsehd/mZmmzv7xHocRvTT5bq6kCFn/9Vxw8EVOSs9B\nCdXrkzjvgweWWGhQYO4CDqzxFJjh/e6Ht54C+74vbBDi/iUadgjR+kOmaeOQ\nxdEL51o8b8ai86OYeKcQ0H7mKS7S9A39orDvmkc2qYnPf4QU8IGn4UQB6JWY\nnhzzJt2Yhndpi0LgI3wsWxnq/lK/eKGG62tb77UgWJ61yU6cWzzg/syLjNtY\ndXyT7cST3cn8MUdwfJxnahiLxQ/MbnioZtc+L5wrG0yQqk7UAWaQf/AJePZU\nasts\r\n=Jsrs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCCy8ktEYoTC9eoyJrTkz2nUb2j/qe/l11s6u4jbiXNdwIhAJCfgFQ2d+V/pqG5OqmciUxo5tyMFsdlkyXUnbB0TsMI"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.27_1565180495169_0.9809250042160023"},"_hasShrinkwrap":false},"0.10.0-rc.28":{"name":"tua","version":"0.10.0-rc.28","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.6","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0 ","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^3.0.1","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"bd4a6c5341ae68e9a996fc2eb83c374da6ccc683","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.28","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-NL5BEvwe4Pwu2wPFn2tnXPTRM/Ce45cNvF0k33pHqXnZaqGz6XR9Ha19yy7+2k5XEKtXgUkQOGdM8KLdiNWMhQ==","shasum":"bb99dd328205407b0706c2448077b242bc2e0e34","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.28.tgz","fileCount":61,"unpackedSize":556731,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdS6lqCRA9TVsSAnZWagAAe98P+wU1uapiaQU5U91qt6SD\nvTH8BcTr8l3HFs1txwA0ljGwugB5A29yGuKpwObrF1wpAciCxJ/EGBFxTOSU\nxwOWbwaMHxoB7ReGMiwb2+h3WjOtGf6oJ0r5ySWXcKH/rgnTVfw3xISPnwNV\nSTENB1cMe6akZxEqbXOByasbstY1uMGQgpXq4OdPoBPPT48HPvIsMyO78uZU\nJ+qaGlLTa+h2r6hK3dl9bpv6Xjq3kIBipCzGk3Wv+1n6xtRN6lwewXl3ElRO\nL99b/WENxLX9aRY4cTZSGIOUR7QQ4bvYpj1OnWscni7OOEWq7mdA5Ln55TZO\nQjRPFL9JQWh0qwW+hN7u2UU/Qw6QAaH2+GqBLwhW33xboAOQuQpFbh3oIKWl\nzX1DJSKpnUrXgbjUL8y/hCFUvOnw9vcK+W+eOn1rmy6rg5x+Lryw5OybEups\n8NItD9b6Y/QsPGFWPznRB6RC4UKEuPrmZi9h143ei/5rAeRsIsx1G12VLJuo\n6Xl9YDi/RdtfDaqPzhDrJuXITpJIZyeMVJ9zRiatjp4iekqnCe4WAwHcb0Ad\naBLUZyg99d+43uMfqu0Xa95/zg4sUsz6ycM/w/8MkY4MNom6lOIAEPbTl8bh\nVoSeKnI8qtQkJSdYwprYkbg1ZtJ7uG2fa7bt6pYmkeJI4Cm3P4aSVhPPibtE\nassZ\r\n=lCQm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFeBhp30UPZzSRAEW1wClpdktNLlBXKlip77VoaR2Zw1AiAEJO6um08CWUJ86YRSXHlKkcvN8TyDRPBpe5+aUdTfaQ=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.28_1565239657625_0.9883322412031073"},"_hasShrinkwrap":false},"0.10.0-rc.29":{"name":"tua","version":"0.10.0-rc.29","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.6","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0 ","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^3.0.1","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","gitHead":"bd4a6c5341ae68e9a996fc2eb83c374da6ccc683","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.29","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-SmSZDPqfoVZD1PesvgL+IJCKT7eRwsPpGqaVU4UPGQdmtPz1NJfLI3+GkpH4V40KbL8gWhvvVTq44SESJilmEg==","shasum":"f39fb0e6c20a97ceac48689d8a8a8e0fa8dd4e64","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.29.tgz","fileCount":61,"unpackedSize":556754,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdS6+fCRA9TVsSAnZWagAADVcP/2DD+QfrH32n1EUhCtJ2\n6QsVgcl4BUwCyMZ1aN0zXA52rZpEqNaqMkmmld6Vi0QbhdXYcK+701M2uDDd\naw0dtVTMI0633LnUyEs4pM8qwgRIXw73+mCnQ9Kj4IvPq9G4iMYKADw4uY/c\nG/KTbYMFWY24uWRJjhIMp1D5r5oqbivvwloxof7yJe3rNNU4Htdyis21GaVF\nQn9YYn38o3SOdMR7KSyRCsQ+xqiAqVX1nhVaBFkWoMdblEGPI5i/syXxNbsJ\nWJEat75kriG1suz6mSvrVZKE3/OuArMxL2PGxBUDly12QGfuliMdSjgOChaO\n5A/B656okCRJwI4JJSmgW+bfhCS6av2mNBioM7h6atMYIeXaNdosTcK0JIL/\nYCdLXQt1YoOwRtulUxOr31M07HAxYiNrHkBDvzpov3WrlB9MzojONQMUNIv+\ntad+cQIvVGOiQIVFHrjS5N0EN9X7+vJcMJw7OFn4bWJqUk6imIXf7gmKZtWe\nsmvvXLvDh0Z+Pia5kbFNaUw/Hau2Wz5gJ3sv/vG8lVRHbYqp/C4DplRYTw7T\nDJ8/3uEa228ZuvvpJSbB/RLRMuZo8y4H1Hddtlm1NIcFEWiBMYNsgkeMsIkg\nwZPJtrEdYgJ5Z8+idrdbrg2eb3ACqlcI0SxhO8ItpFJiZtvrLQ51oiXnVoa2\nD/Ew\r\n=WEbg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDxvTZUkS40DxCSFdRm+sUxshSJ65TzF09GpNkLLdwq2AIgS5opL5rDUdd1/U7hT8ZCEojNdkiAg1tuy2h53TwA2Y4="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.29_1565241246136_0.14558962919200358"},"_hasShrinkwrap":false},"0.10.0-rc.30":{"name":"tua","version":"0.10.0-rc.30","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.6","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0 ","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^3.0.1","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"589e3024a815b026c4544db2ad7af51d56bea7b5","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.30","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-ElnSGF585Qe6oYA4cnjuE8ezPVJRzIkKmrAHaZrw4cnC0E9hdmm0LxTssoPvwmtxRUZ4wnfg8auVIHg1fbVBhw==","shasum":"1819fc5fe343be2c665e4dba20de24a980ddaa46","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.30.tgz","fileCount":61,"unpackedSize":556256,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdS7SOCRA9TVsSAnZWagAAtK4P/ilDY4zRq5qJWhxTBe5U\nfVy7mWsmIfZbpv6EWteOi0P1c/8Sxf0J2wlbVY54G+80cymQ0t2F9nbZ0ip9\nMleUdEChT5qjt5BY2oM1IkKpSCH3CsMhTwWr2tRnky7s2WtCJiT66TTCyQZn\n0UlHQrEnmPRbZHd/5DXGQlwjvTxYic5Tb8LwXFJT5c8+w/Q3BVw9kHQSX+jQ\n9mZ612jBbpo8eXSKgvOHYQn4/xm1rm2gy/Mspf6Xb2rEx4LZtcw9vuS6lKzN\n5fZb7LI0jxMwBzXJpE6jo3nUqTPy4Hzh6GI7D7JuNsnPudSEyAVTYSHhMITY\nnq0RZAa4jKxXELZq6mqr6hrKBn2Skgx66KiTCOeNTwSBU1Ab54V9901rkk/2\ndqHMLxyCPFb883/Ir9MEDHTwfuwsZCJBSunGLYfFkriyADV2k12wrCg9kEkZ\nFwR0CLfuwmpEvlCyG+YonWfTjBzHgVAbtFOyupuzgRwL9Fs/u2BWoeX7o2XU\nm5NOQ9nn6GxZe4J/SLc9oPfe8gpDuw+wKfN3M0hzJXFuY0njsKhH3s5blLC+\noFqlRF4165wFFLglR4DBUG2WhrT1TbficGjRKCO+5n75ONZBmjmky2EJqLCO\n0TiAzc1SNm2seJTTBjRY7SDwtc8UKbMeBYiHxooCOvFaGzLGiOTXcC6qpWC8\nvT2M\r\n=0KZG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDtpFGHOz+OaNtFNMX+OQDGvjjTdw1J58jUwQTweyTNmAiANcEa3dCXX3MIlW/KQKAa7tnsQ2pc4QnAmK4URgnAsGg=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.30_1565242509300_0.33322711308644437"},"_hasShrinkwrap":false},"0.10.0-rc.31":{"name":"tua","version":"0.10.0-rc.31","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.4","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.6","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0 ","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^3.0.1","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"7a13e33733a9fd92f511ad7977e315900a8e8e8f","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.31","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-3527VargXK6czqKfR/xdMwMjesD2j8XcpWosZ23fBkgVf4aCY0Gdms/txpE4MmUIU3Ns4fJ38JML6WJ8m9mPMw==","shasum":"6d9440ae41377e85e0c17aa2067207e21366aa8a","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.31.tgz","fileCount":61,"unpackedSize":469489,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTApaCRA9TVsSAnZWagAAQ00P/3LxeS2RMAN7rSCgaFGQ\nUMnNvkPiknGiahqo5TdgwmF71R9bzvzutvW2toPTSRoVpFb4UWdPey/Mbs3O\nnEiWrD4HLIZBq09HLGRFYxzRxeq7sM7IoqP/Q1bT/mNBWJVEJ3vUo0DnHdHC\nUs/laMNWQAEj3C3EaUHijPN64lUHAvpla1lr7OlpZ7v6g8mnkIJJQem2TSIb\n/qht7lFz2Q9k5rYmLUMrSNG+cNjJWoGD2IM41YWiOhS7GacrilJRk36SxoOm\nGkhW8VmCCPWj0038eAsEMl7suD4o7Z2/YCF4QO/IFo82zdEaGbGkHKr3gS4n\nP6gepaOoSdp3kTGVYljDaG+BRsZB9f28UpuVzBbBZ7IPzvmnKTLax9bcj5+c\nvde+xH1tFPm+VCDT6GkQBsqeLyPxGalF1pGskZl34JdkJkaUFdD+HCoJ2159\nsa4QBF9Toj7RCeEV+z6s0Sv9pukrZU5ZgZOpsh90yciBiPai1lph0i5u1Sm2\nc7ovvSnZb2kt5wcj5BEQqLxRLipKyZiTr1AV+0J4gBiuvuFhWtNI38w8b6S7\ninr046i7Uv++h3Cteh8lFiU3hXz4na4GbPC/UKLpV3kwhqf66ehkfGEegmA8\ncBi3GlELa/0eG9WbVXRumXBfiw6UY7lFk2CHhxlnmf+n2SetD0NXSL1MxFWC\nbK3O\r\n=Mj8I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHet882+lwl7mcCAbEWVJxp3tFmEaxhPUjPcYjvsqZxdAiByE8nVnkNa4w8cJHRSN3Nqpsdw910sYmN3NGnkCtfJLw=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.31_1565264472499_0.8163349982802699"},"_hasShrinkwrap":false},"0.10.0-rc.32":{"name":"tua","version":"0.10.0-rc.32","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.6","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0 ","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^3.0.1","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"60860a321f0dab65645971bb8ee5fba623169f5d","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.32","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-WIjRt+Ft7NTZL9w0ZL+o+5DOGBrP3WIlXPQrGIkfkp6mqG8lsi0wbYpA9ox9EwvluBl6EBboiiHuj+bdQe5HZA==","shasum":"f7a692689b6f9b4ae2c5b31411459da59c2a0c7f","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.32.tgz","fileCount":61,"unpackedSize":469512,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTOphCRA9TVsSAnZWagAAnFYQAJEVHSRxFYPaaJxe6kZ7\nAdBYnmCbOpSFwp810NuE92gvtBVFoF+0lTLKONWYiy08ZtbjFqWpCMVIbIL6\nC6I9gW/WCrsOc/gxUdS/F6rkDZJP/mC50pwwbrrbo1DrIbKBRdp97QchJnvK\nzYgt9NGC4NlRKvKGB8aMaZXfRnU4ssKhM1F3HDdiZJlP2iDovgG5fLqzvaM8\n5KENwHS6Kf3Rbsj8KoLoq2NRKUpFlKZDZ0+b2orylrsOtO621GLzvpT+3Ksv\nxdRfqvDmw0yh0utvuvnmUj2fWmH/M+mA6uX3wYVDfJKyqQBaGhuMII7R65Vj\nyIG8ovix1sbJY3COOVUKCpPEPSU8Zyv5d6IuM8v+R4zbCEQWkvObQt7b1dLx\nRFuzWkTpS5McjrzJ+quU+GwOrKTkk9Yh2Q3vUj/z+yWgIc9ki3POEpcNJHuI\nicPh71yyPrBq6Kp8jcEDagsZNEVdxI1ZKnZmAmSqltdfQgtB4/69wLRo/pYU\nv4BTBa3OA6AEzYp2vzv2uW8C/WPx9gHHNBt/AiZgC4uKHGDrbefgGogt4Lux\nl3G5gVw0TJmNi3Wqq8yrdZ+0bE/oUgZSmbODt8iiQKUoeejRPhfKT6kMYv2X\n+9J0UFSmbJUaKRmqwSMyWWBIKzQwqYPENUFLZlIiMbWrh1fvyXUsllp3CaX3\nVOQN\r\n=D7dt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDVKtYd+pqYkSHrp1iJncO86lqbsRpBrlw3ZscrocRqwQIgf3iltSMY60y6ax5MXObmSLJisNAipArn+kxBDehW6z4="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.32_1565321824185_0.4536398419590255"},"_hasShrinkwrap":false},"0.10.0-rc.33":{"name":"tua","version":"0.10.0-rc.33","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.6","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0 ","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^3.0.1","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"db8bc26e42c963e1ef63bfe055d37839aa40af7f","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.33","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-Boyfy6OrsfZLnTow5PMlujEwbDWWsg6cZ/drhRzL46UaNOMefnan6K/yn6jP10v8DMinXSCsVr7nZaHzzqb3mA==","shasum":"e153e86477a1d3a85fb103efef995c1e949a36e5","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.33.tgz","fileCount":61,"unpackedSize":469534,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTPXoCRA9TVsSAnZWagAAn2YQAKM0NcNTeAZWuvJGDVQZ\nkrINdNL310L3FLz1qhlQpduJ6iXH9hmvaMrhVm3AlRGBPtYYT1FgVSr1q2t9\nIX64SVHdy5IhRPAY9Sw2T4MSbnx+beyjlamH1bRAo/6qTmTmOUsY1X3vbMzT\nFvosPGbb3BpTIRSXM8WZcMZYEEho8+HEB1v4LQa0nVfV6WTlfYk5Hp0nEftK\nqKxw0+uvIHnT4W765JXlt3ib5Wp12fJMOhvL7Ts1zqG3yoGAwo53AJswSTnp\nOcUvuU8uhb2gRlCv9iIJ6c5VkDIRN8JsJIv4D6W6mgOhEIrEPO6SmGVroil9\nT9EAI/b2Ue3Pligh3xgWRbRRsMxbOHebJoA06UK3psehH6crx1XoRv6bRt3f\nk9LktLbilDdsA6APl0ppowJnsMic4ObMuKK7QoeuwfrV7UTR8fAVqVuAwTC7\nbEZECbdbTCnpgLkqO2vdZZvtM6gi1ZGz2hoPdCDrOIqlUA4Gwk6lS8BzGrQN\nJze5NdStU0cDGi4umNyStQS7Y7YbG/oowRMvMlduqOeZOh8TtltPV7m7Pw9e\nMZ+GErNnKR8kcml+A55kIETqDu1e4PK4iA+PgcS9bhzY0gnmKGi4hVB8RuDh\nZ4U48bz8OtGXvXl3rulbxAUW3oE1Hn2NrD3B7uCokaJEt9D/tGcHqA2iu5Yr\nd+3B\r\n=kECH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDHUCIG/3dUUOp8DtZD2SR9lsr4G9wO6lFOYFXapuJPjgIhAPb1dZQ2tMYLRCQxJ42lMA2OoIn3R3AifzbS5xbHqK+Q"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.33_1565324774720_0.3424343895900128"},"_hasShrinkwrap":false},"0.10.0-rc.34":{"name":"tua","version":"0.10.0-rc.34","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.6","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^3.0.1","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"6c7d9e785046d88a00c7fe7c16f59c6b60c69de6","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.34","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-Ol2q2jOQNJTNEzvEd2sgqYQQexIyD0ZESC2YoVRCSq4xDOZPrMYib6nNgc3YouO5mf1U5iC4CMaV4VJdCd8D6A==","shasum":"266965a925415f7e3cfea5b98d4fc74d58eb4c74","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.34.tgz","fileCount":61,"unpackedSize":469482,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTXTXCRA9TVsSAnZWagAAsRoP/2F6qQwauNBmTdQa0/yF\n3CT/jrnJaNIZgllHuzivTDOuUbKeOkg/psQWQe7wqrdTffwuoMil6RTdPNUQ\ncptD6/c0lM9xUVEJEaeXN/8V6SVP5zDsiNExjKHFBlJa5+hkzRI0ytq0e3fB\nDx6U+juOiCruMXCG5loXD/zZAIA5sHur/CXV3TFAF3JLuJ2Iy+OBCZWAbQx8\n/TX4kbBBN2S1uMH0SrFUu47+4BTn6NXCjGA7vwu4mttqa365VwOZ0MJ3l5R9\naVrcADgf9ZRSXKWhMEzY+IynNb7Hl6jxICvk9MBQ0WwbXLvt/YbImPgEcQuI\nLTMXBwTuAlb7ctfRZrVb7IAbTriLTn8J8BLvaCyvzZxfala5I7Lpdzkm/0t+\nVmH1bcPzEeiq6KjMtGpEgH1g7VwXF4gqSeC4w68RWKOp0r36dbIPTH6ZLbIK\nw/5zztG+LhvDTqFYVlsJPr3/qVlStc/RPm199FqVjaRh/rJ8MRu99zgMnkwy\ntq72NduuviN9Ir9k+iPkx8nWNGTH/z3hFij6dfnyPqvbFhwnxWr2bH3LoLAs\nF2VBnAWFc937/j20gGu/DfG9ofcv3xfMZrllZ5qSScP6sV0NlyiWFehFbqmM\nxjOIAF4DxVuIuwO69cbU6h3hAIkPfz5nvPdvDqCymVHNh7bS7zrADUjK3BJq\nRLwW\r\n=5+ud\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGQpo/3ISMXi+4yvpO3CyGn5SKYJnxBf7igJrSqeNbZ9AiA5SPlNiLh6FgzYuoYkFwOwHLm/4mafyjG/0kNqJbxDZw=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.34_1565357270740_0.873752913696555"},"_hasShrinkwrap":false},"0.10.0-rc.35":{"name":"tua","version":"0.10.0-rc.35","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.6","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^3.0.1","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"6c7d9e785046d88a00c7fe7c16f59c6b60c69de6","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.35","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-XmRMoBzzo2gNXHuGy3KAoxOuO0tUMof6Zk9HZtjYJpSoNHKAF744KR6JHUFb/XfU4yyQkvBXwqIPKdUsQTOyKg==","shasum":"7f604d687b17993ea8681782592f9a91c26b96b8","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.35.tgz","fileCount":61,"unpackedSize":469541,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTYWACRA9TVsSAnZWagAAWKgP/RZBjqKehuZ5Ysdn2/Kn\nS4GCmQ89N6e5Yp0dO19YJbPO6MdCsp5tZiWpDJY0trU86Fe0FuJc2RqaBlf1\nN1+c34DpktrpSSbH1nIXO6EeAsVWSmVaZCcyCn3T/QPV/cQXRpgvmAYVeC04\npUXbU+JrRoYXGuacoeqLUsvOJsSVNqYGa2E4oAfHJRkyM9k21o8MQm1cqyF7\n+wmgJBsYwsxMlFZCkz+V/bvWuQSgNq0z4xB+MHJzm9L1m6CCDt7BDIUabUFk\n7MB8dvrP00NVN0JwmRTdQpgDMKPcisJAk4pIt/hYzal0zKzPwN8I1DJhXO8F\nROkw6hhJVZpzG9v26Fh1G18/wC1os+Nkdt103oC3eav3cEWlhFkFhCu6kEJn\n2KqSpJZTT4DKLrJfbnef22MH8aUp7+nj5EpT8GvCI7nv46hLqbs7Q6Hhm6Xv\nvwOMQHR1AUlGmtIzz8WwSrKOhL+MY2ToukpOcT6Ip3ieRAsFSz5xF1CLa+cX\nvoyicKbJscYAbwp4kFYtEz5VNTi2dYQaueud2U6ud3/hj3xMJ2eC0IlUqXRZ\n9a8ZCQA/0qw/SgF6cyfZ7h9DE3C1Ax8UG2G5kfyjWHGOCyiyPyYk4qTf2LPw\n0t25sKfgBel9thQkzVyl2Wpg2lNQWmJJebz5qb4faQkLNOk9KYGAPIjN5BSe\n8Xyz\r\n=enSD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDBOZyQsMXjLGnueJ1cKIX/3wYRABxypqFj3Z1abXZF+AiEA2LDkq8NyxHuIFVLXIYmqsfrODzR8LwgnENUihbC0CsE="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.35_1565361535530_0.3656634423784624"},"_hasShrinkwrap":false},"0.10.0-rc.36":{"name":"tua","version":"0.10.0-rc.36","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.7","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^3.0.1","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"128a375b903b5238930eaac513981198319674a5","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.36","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-XQknFcM8NsPAM+MidzdXQU087vZHH6FUbfeLtd+ik98HOJiHz4s2AsQzEthtFODdYH0x7LxM7uizm3J4uV9RWw==","shasum":"2596bbf3520d39082f9933568340b3fbe809eaf1","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.36.tgz","fileCount":61,"unpackedSize":469622,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUBh2CRA9TVsSAnZWagAAxH0P/RF1+vtklTweJPbaQU/A\nAj3garM55I4c7PxkHmVtzgIcCWAegqo+6CXQtOY+NdVDC68XeUpOH+0/OuA2\nEFr5IpfEX0+N3vLUiY7GPmHLwEeYdlO96wt4GRxE1s0aU5xsU+VXxbTRNizf\nMtD5gZ4DIeduBtuqBlpo9TY6/f1IC7KTqfazSN+iDGCoLJmOeO0dTqG0/31h\nhaCI+bXVYptiD8jHpWoFpgY9Xf2FxcuOOs4b0MRkzOXoMRQb1byaADbAkRHi\nRgUkAt/ED1gfmTjZzaN3RZCv+1DUIJCXQjcvPtT8KW3glWWI7X+EpiivY+xY\n6cifkrIGGSILGBYkMM2SNHsX4JX7rWYGH+MXIujo+sJOZvBvlQvwEOCOYCtI\nKrwUEBmaMjgzRHeGY3PhPcCXWpARoIYrU6VM4n6vWn81tUzGmRq8GA18hFoC\njLIN3/m2TefOklrwjfgV8JFGXo6Ql7qfcJX+h20WVbFzoB49qJBIuM8hykj0\nKXKfrt3Tp2rVHjYUIZOEPssg+B/Lm1U9vP9476MomqvqrrPtAmyu6s8c2LQv\nrKl6AKjOuO48pNke738Ldys5FF8dFxGHaSuNb6fKWeQ82+CozDyk9TCVGwJl\nOY1qmDV4qIgJ7HMrxbe08fFlPfRSHRNQWEsQ8AStBllrS0AqiqVXFlQYPgOX\naLHn\r\n=whyK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEnwxyJ+63fdpwDmvtU607WbznH0YEQV2syaVkH8S67jAiAdLv2OrYYjMgXIMCI/m+gDiXB95P7H1HUetYFGqrVg7A=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.36_1565530229882_0.20093740798567228"},"_hasShrinkwrap":false},"0.10.0-rc.37":{"name":"tua","version":"0.10.0-rc.37","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.8","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"4e4dd335828ecfe237583354cb6cf91c7d8a1fb9","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.37","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-x8G34iH4W8ex9kE4tT3ESS2jgvZ09oa3QXpQwzPG0cqH41lkn8q9dNt6kbUkH+mkn8LUSAASsDArdpTAskNk5w==","shasum":"df2554348cf5037d42e0b5fde5c249c7055fc448","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.37.tgz","fileCount":61,"unpackedSize":470451,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUEKMCRA9TVsSAnZWagAAsRIP+wQWabtS/7ej31RFCW4a\nLtejLAbHIrWAiQyeXWr3pQd7jV/Y/YPbcuiBEtlHyFAYOysx2EYDBhxj5MiW\nTLNWAweRfT2OVBVzEWzZEDIoArKHkxggMKvtXTAEeJuwTnqWebQELIVWnpfU\nQb/1zGvnLQ0URsGt/Z9gWz7qdj6otHgiKz0GFrSqUuerCYALe6h0Rai8Mhhh\nOpfYndnLBKw5cj6kHEh9zA2TC8QVXWjxGOAVKMTFYPkjM3gXQzcrZV0Ju7t6\nheu9etyw8/NBeZ3uz8EJRAga59swp23m+Mqen/sv/MZrnAhUNqKAlDgauA+2\nX3VfRc0Fh3IBAhPkpXIv+luBeyD1yE910QX0owLjthfi3mBQk8SLtTVVItxb\nxdO+gTkMqCKI5CxkEPcOSqRzjnOkpz071l2ufgvEIB44+jT0xk/1Dbdoozdg\nYXviY+xcxJB4M/Z/OLqpXz/ajxHUtTphPkESmXp4FVwxxTJSNTQtbcMHkS9Q\nnFWSW9Ne2LU1rSiJu7kbnIUKTp6OUHyBl8STI/JoI/fFsaqtoPxTwu0hFCQn\nix9d4S5bBUmY2W1nCs9QQS/BlzGpPSfGzxWdfZN5Ix+c5UKMLaCg2cJHbnyF\nLU5ycvGYCIoxWR1chwF+PjCW6PF3XIQ5fgptAnIpZEvHaIGQfaaL8BEXpaTP\n49hh\r\n=/aZT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDGuoIXKBRitqSk61AzGxslbnqvcIJ7+IjlmorhBKWtAAIgfJ+7ejDMfmF2iIjS1ewPKM6+z+LoM8B23oEMgHRPV5w="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.37_1565541004349_0.5730934383585937"},"_hasShrinkwrap":false},"0.10.0-rc.38":{"name":"tua","version":"0.10.0-rc.38","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.8","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"f046a5c78b9bdcf80501eb8aa1677cb18b8118a6","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.38","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-PjyDKfhbgv0ty8HTpWI8Rty97sJB/tifEFUfU9YaUwscsNergZ3XZ7sqDEYXiq+hDslhPB+CqJXV0kakwhEOTQ==","shasum":"aeac2d96512a1af3ca2e61ec5d0f8b13b8469cf3","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.38.tgz","fileCount":61,"unpackedSize":470520,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUNdYCRA9TVsSAnZWagAAmx0P/iv+pA1p+Bfxkq9mgjLp\njQl+iWTpVhVLkAbYtC7wFuv09yjzH8j0WTw/b/YFG2y7DA3Yh5GWr2Dn0Bxe\nkM2KFxoZ2OvcvGv2GxKyY/w+o57us35J3n6spxJqbX5UwrD+3ogH5X7PHVJF\nUgNimAf93HJU+iArFA1muXZ0x4oM9NEb5HbT0CixjoZ982ewYnKjdDrXqBhz\niXR7cGTt+Dej78MMXGVlZC8lfdE+d5ylYr3r95+1vdt4drnxgYCuv8H1gHg4\n4n5MffTj+TKg4EMkrOf8CXWxWo75MTtIM/H5Q4iM0eJacd3gMnPPea0uzf8g\nWlLiRylRnF0bMfgV3jT2Ks89anSYTR9F9pPm/6qY0h10afzQuwCNnay3em0z\nllY9EgtDLpgtxDhyqeKHk/0d+17q1K3Gzopd2ouVnId3O4wnmXw++r20vM1b\nM/KFOzQvtT8stk5m8YZ7qU/UTD6v2No6WrF65sS94wDpqZPUdHJTEVtqPZGD\nlKsqks+B3d15AeNel61rxKrtMAkBKjsPTfdsmk81vGWB6z1QbWm6z0l5w99m\nGykRgZKyZ8RrZjlwz2EWNC/aRCqZcaj8lbE22kZoVVG1yc94oLoBQWwTYZD6\nXHqkbRckaINgLNp0vHjFUQD+/qLAfLwOO7jHdSwoCzX6gFZSgH6Pu5oHe0NV\nM0/q\r\n=HGj0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG9V79ZwKOo7aAHVCg/6yo9w8F++FcMh8O39vmXvgnXOAiEA0un76FiHJabkrgCVnz/UImN1h25Zv48r5hl7umLFEXY="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.38_1565579095687_0.4290224791525723"},"_hasShrinkwrap":false},"0.10.0-rc.39":{"name":"tua","version":"0.10.0-rc.39","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.0.8","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"b61dabe2a4af82240a663a4a6eaf73e7932573ba","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.39","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-Pz6x1kRWPoTeoUOIhaJ/bdnqJBBBo5i/fDRErN4GWXzJtXnFka1NzTTDKy9hXoYj8IBUzLNL7A/GfzJEZerceQ==","shasum":"649d8b9f4f157411c1da3c9f08e74b08c350f8f6","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.39.tgz","fileCount":61,"unpackedSize":473133,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUrahCRA9TVsSAnZWagAAbjAP/iG87/dqlN2L73bSduEM\nj//76T5caDMy5uFBglicHmvM7jc+5akSyzh9VmuQwuFEe30p74rOw7+4+k5I\nLN27bHKETJTp1U0MzpoH6CfQUflVEeRy4Yh5lTFbcH/H4Tjv/Z8lypVZB7EE\njZmVTC1+z7/3j4A8dzLJviTfQQWZT1RKKO0hUDjofccgxyyk5pGP6fdcnIjr\nxWe24VQdk+KRNatUrjCnxRrEI6zuoPaJMDkiSf6MiS/SGZloW5urbyQ5Dg2s\n/s5zzy5ICgR4G+ZbgqyNAyYv14aiOV343E9sY/8UALqhGdUcG22Our4s+oWZ\nBHm3W7GbtS7QwnDkQlKoWTlhyVW24G7xLH8QAPRd31BzE+zerwXrtZ45nZye\nxALRhDiDKWYVGvQyelV4p1bQ2PSQ8noVrwitdWtcWplkwsA7gdBE04DKpNoA\nVUz84cZMH5VvkeiNtHTmxVSqxJBbAvzJUYI/eq4DYn/cJzmRT3Ojwt7AUmDX\nArSqGCiKDbFqdbDb2hPl26X6IgpZf3h4x6VGKHjPX578v7TFLnelQ8CGsMeV\nOXKadKEyNsv8+eSlJr5d9vabOFqt5DpF9dTlaDLk2CEUvXiKhAhBLEKn0J+v\n9BZ/b1BFdEI6dplhu7utiDdJ8oKTa7Ey9Ey+zU5/MtEsW6s08hDB4ugfeDtC\nwEfw\r\n=ZzCr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDTCuju0gKXliK1L0spCjb3/wc2dmHphMvqN6HZWIcm/AiBieE0n87tCH1Y5z50f/Cms0TXTgr3H9rFoN2cDxwXB6w=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.39_1565701792190_0.5702517092076358"},"_hasShrinkwrap":false},"0.10.0-rc.40":{"name":"tua","version":"0.10.0-rc.40","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.1.0","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"b62fd2dcf1540463b5d531226af4837199560a6f","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.40","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-MtR7L80tIHoORxMhAuFHSow6Wn340/iXLKn4bjBTnUZoKj2twwl2nfkb936HaZyIZ2n5How7vdvx35modwlqmA==","shasum":"92dad521d57d502926c90a683717aeb8838fc64c","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.40.tgz","fileCount":61,"unpackedSize":473424,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdU+ZuCRA9TVsSAnZWagAAMhAP/04EcxlnPdvAkh7DUy70\nwK9Y1qaDEPbjsCEvQiEntcQo4l4l8jnppNotn39SAZ/lm0vXJMfhPuDoI7FV\nt1NghMrkr15wIOebM05mReWXt5qwt7qvpkKaQI8KsPQUFAwKsHsObwuczmL0\nABPSpqzPRMzNVLiUXYILrwCmp91nW5GL4hWmSxlr4oRyJnang3uYPXh8PFL8\nCKaag3fX8wFIKU7eTTtaWLYFluUuXKqLj+S5IDS+EkALlisDuOLI0tXTNgjc\nOMP12Atd4xnCw4De1yeGGPLei7sw89Tv9U6BfcaVngf3zDAa/e6UZesz+Do+\n0bR653rZkXOJ1KOaZeJTBTCYF0WrDcQyZseA8b3dZM6+nd90C4FMLTp0IQB/\nFpsT/rFwm9spl7WieB4qHwyvP9JKS7AKR9Pb7FAoLbKOQV4hKhVm9ZwximQ4\nV/HzY8zMNfO+YY41hhtkBSS9wjNR8Qpx+kzC7z46WAvmrIhG8GLHSuhlRi9X\n/UupTB2zb2/t929yHwc9o8gWIMyIFzWuWEoeTCoykq61ExmwgtghQCWzrP6/\nb/idQI3HV8u2JjAUaRhyzfvGgFVfISV0qGNfbVQLkYvRDczmJyCnl7cvSJXv\n2qP8miQkaxiKh4uzqfbbb9EC79vPr3FfBDkmb0sil+8Opb4xOK5755mZv9b9\nnBE0\r\n=6nNN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDGYDjP65Hu5/Ezhh4+hNTtOPipU6oBlvRL31JkTrWpbAIgHRKgZYCm5mrasAFeH8OCbuIaBK6U317Qk2HtSF8wnwY="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.40_1565779566234_0.3432748511488397"},"_hasShrinkwrap":false},"0.10.0-rc.41":{"name":"tua","version":"0.10.0-rc.41","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.1.0","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"d2aa66abbb68f27afe1d3b3f649a2ea408f5b21d","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.41","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-VG56r+uddlPXhsBeNfQnRUnAWCIfY4Xo8DkG1FgDmjJ6ood/r6g7hjHmmlknfKL0pw6nkpaniptpIV9baoOVYQ==","shasum":"ca7b0c98b86f73d6f551235fae08a96ecf4007d9","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.41.tgz","fileCount":61,"unpackedSize":473439,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWgaOCRA9TVsSAnZWagAAUuIP/j1OBrz47WIxbiR0B2fF\nXAJimVQEAXRk0rM1YJU255k+wrDZdnXCy39rWmvhd5WRIXKmuTQ8cjjX799I\n/cwQy1Wq8Z1gGzqtcVr0fX+sTTJXXUnWe9aNjz1lPGEI2hZSC8JEpCiypqrB\nU3WypOdaCtme+TGHbVQ/dnQlYqk9sC9FezW51/XdDomfKl/0G/gDP1cSMMp4\nlgZdKZT0PSuP0eMGtpilhmM+itoNdJ7rOxpYHUDnH/K4OA61RxRA+MltKEf9\nTRAXmCwY1Y013hgXyx/C5bzhuQjYmgVmw6wZqehmEF6g7GNJzUsfuRUJpg+7\n7hOMLlPWrKpnrJe3aPwWku2slnYTgpvErdUT1g/dWHP599R9KAWakOeEdrAG\niLGdZ12Rump9SJ+HS1f56z2qm69UFvhjJUDTuWk+2B3ZFYr8CRglhga6vZ6R\nekiRPIrsVub834Bo13VL/Fi+6wjK5ErI2C7DcGqn2q4X0vMHFTCQYBdV/UwH\n+71AYz3Y1TpHryXSFQ5+gWbSXo5ogG3NUvs8UpaxLn/tsImISxgD+1zWlFp4\n4aeBZUkFsF/Rb+MH8s3RFZ2dWpcWZ5nL5NE+rzrKIx2hGYv3Xbys4CKLrIst\njBTozMHXtF6dbXSh1yMD9mKvusds6bvfcRTYRcTSziohNz1xINTM8H4B9ItH\n+Vfu\r\n=1X4p\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFFEfeiVxxS0zYAgyCqnmsKtGNaoyor2C3kDisPcn6X+AiEAowswVRA9KtpH4p3bWsu6Jzzl8UkVWpLsrUdCeiu6lSI="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.41_1566181005916_0.3497802154759775"},"_hasShrinkwrap":false},"0.10.0-rc.42":{"name":"tua","version":"0.10.0-rc.42","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.1.0","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"891d9b9573c63b298ed97d0cbd1e6e46e8dc04e1","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.42","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-2eFhUyYJreO2YSHpD4wu/1vhtKP3AuFmc4Dfpj5Ug5VJUgrWsW3TUcHji4rssFbPxx3avsOidzGZma/NowwPkw==","shasum":"97a3c1aff60583a871e9c5c8ae679b6709956c66","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.42.tgz","fileCount":61,"unpackedSize":473515,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWmcRCRA9TVsSAnZWagAAS5QP/0g76l6U3iP00qVn65iX\n2Tf6xxUY2LwsAPHxmn9q3qS1S/RkXEteXMWBjP/ycTEuuhlZhoeWkJ1GQuXA\nqmMIsqIRl7P+b9eTlGplUC+xS+hxbdpACHYYI+pVYROJDQrTeXp9H+kU1Erf\nsFVQGt/mbuM8P3XOf/v+vn8SA45J11a3qY1xTYaEHVqgCqKB0yrJQnatUPBq\n29gXimx5DAUr1rEvt4E82E0F2GcvxKA9xk2+zzK0LJDC0t1Mz/z2SEGw/bTP\nxb72nKq0fJyYAQNSvUANSaV1mZGVw2gYmv+8/HZOibnAI1JXy1dh/B6gPZrw\nKlPwHKZ2RijH3iOqZzB74hanmFKpQFyZdn1QsTMBzUxLbN1yQXiZ5srOzQ9g\n6LVHUSl/CJDWYF3fJQqX9j7f8vyyI5v+9Jnl7ozuJgMz0pg4frqieXydfOuX\nbasE3kNPwpJp/dqLMXKtE9lM/CX7LFQP9GlbmJ2iEWdehwsS/HoeyUkR6zvO\niilQjmzPl6luVzJIgMaE52m1NsgyYHu6TUUUFOoTjee7+TMCIndFfssZI3h4\natEj7eELZ5gAYxmrWlcBZLZCReyVnsfu1CjHSRysQY1kfsdQNp3plfImF5/Y\nMQ9FKWe+Kx21REgjR/f48AArVEaXt7uBWA44wKqdX3ef/fNHrLvmXZe22tXy\nytg/\r\n=SEHh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC+mxNchADULpxPHg1OC/+baWWqeAmrZ4aW0uC9ZcAwfAiEAuCY+dRJhzsoIrvlHPqdGWl84FFQmmWuK44RUtZjMV4E="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.42_1566205712408_0.048664654164291665"},"_hasShrinkwrap":false},"0.10.0-rc.43":{"name":"tua","version":"0.10.0-rc.43","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.1.0","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"3182eff0babad242f2f8f827253f7928fa2ea34d","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.43","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-ZkDW3rZ7HmD/Q0jlxjgpmiFgP7stFOBj8F2wSTHJeNi22HP4g9AmPipcX+KFhe2F+zzQgMVOlIry/m8UqBrmLA==","shasum":"d16ce7c6bdb7528fcfb9f72c3439c77bf63072f3","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.43.tgz","fileCount":61,"unpackedSize":473518,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWnwdCRA9TVsSAnZWagAAJQAP/ix/rAFnseq+xWpXyoML\n3QnYSi+e5U7kOUt+rZKtlV/ttl0sqK0eSUkYFWIO5qqwQCjfM1OJ71kW1zLO\n8dLQ79vetssBIlguS0aMm+CQExGY/w+zizMMEoIUrr+96BHynn7XBdQP7dt7\njnujIRPgbEy8X7FW1rDsJfNY4z31dl/J9drHtrNnZ8chMSKahvnbxdT2tN5i\nHWX66HMuUs7hBPxU/oI9lkqRMz+gS4MHWbDTAbvGq3Qe2oQFrd16rqSp5lSb\nPZn48koIvOc6gUmuTSSy5IGxF1k50b7OkejujhF0eqJ/i5UHChn5YiK9AD0u\nixx7GL3lQEVtkvCIjhyqSvH36+BcCvT6Yj//KtxYkOSYD0mi7p9ZrTpWs5FG\nP8rYqvWamRVAklhtEkRreT/sZtQVkLtKVvioLbK10Gkb9fVmPVUF5kx5uYwK\nP93Kic2NIADVd6C4FNXkVfv8rEAqk+mSOGyAWFhFBM8sOe38n9vG6+Wekub0\ngywYEN+ZMS8BCCrNac4bFcZ8sEoc5r9atOLKJUz2J394V8wip5X7VvcC5JyH\n4e+ChugZVjiTHHTIaQ71Q6oohOqWs7Ca179HYBYYLHDfGfincS77Q77lX2ps\nVj3nUteRc5plgvCNnTonoMWceJ4mqlesUHEF5ajkN4ofRZF9TH2XG/GdrDiI\nN3qO\r\n=sZXF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF0tu2a9adOHO+pCkDLraFALOnqL+wrqo/o5dRkcIMdUAiEA2AAW2K4/MWIRa3BmZOm7PYUQjBVbpNfOddDig8HQWag="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.43_1566211100603_0.9766266784764512"},"_hasShrinkwrap":false},"0.10.0-rc.45":{"name":"tua","version":"0.10.0-rc.45","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.1.0","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"be321014cb3ece2b6015005b8d488a83b8d0e9ef","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.45","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-LYHXtO8AGSn+1VqUcFBSCE56reorNj59v2t1FRka5AAb5osK7r8XliAj+5eFP2jhRkYGjeRjt5aLCjf/1hxZ8w==","shasum":"d3f18ce30474fefc2bb7a35d3419baade0c1a564","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.45.tgz","fileCount":61,"unpackedSize":473547,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdX52FCRA9TVsSAnZWagAAUqwP/30Ju2Ijj3DDfgl9Fq4g\n7C36CbxPl29fmu1/zoM57nx/AdhHXUdFuharUmpnZr6pB4cxEbFKh2Lvj8vD\nptnkXy3yzHiiyPJkFzwy5Uh4nRenlTZyLP6JoBmlvsc7WSeNlpcDZFSZEsjO\n3Nv6/nehHGr89ytZibWBuiksKKP/tgMClBm3lg7/2vknkzhgDJ5YD6tf1Pci\ncEDwfvG3OhrpRxIHlw6Q6iTK6i6tNHx3InVdgjPCp0k8D8J0ye4YWHkJjj5h\ndxGF08d12UzeCTGXqeaSsak5SSxBR0tbcoH8j0zA3QN6e1+vx0gRQgG3QH0n\nUlYscF1oGvT/YMEn94aIioiW5tpGtZdYXfdRWZqgAvWfjM2MctNAUub5dHQ6\ngiGLvI91gvQLA/CfoBimdAkCJrXZ2xs7fglHx01ZgftIb2JXKy+sFF/7s1bC\nZcuyWzK4CSNncRS5bTNWuTV5ZzYjxyb5u4Qlh5iKa4gENe8aSrAMJuUcqjt6\nojhlv8RgekYObCo1e2X3vRb5DwbLOBye/mJULOQcpySYcHncYP9RPz8vb7OW\nYG4+tPwBcT7l22K48rkseMlgju5AA75kZkEZ8qgdPE+UpEv+WdP4WJOGPjZ5\nnvi0maGeb6jUYEL00yebNJv/e+j1IZvtoPPIbJTbcH267nuCTPwNo9d04g3K\n1Zt+\r\n=QhH1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH4xICKCNe3cfOd+8NgJOLGKXi3W3pE/Tr8NY/9K4NAoAiEAim84w85zSWZ1FGoFC+6WLJYrGJyZ9VXcQRNFtAh9nm4="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.45_1566547332916_0.31513191755860737"},"_hasShrinkwrap":false},"0.10.0-rc.46":{"name":"tua","version":"0.10.0-rc.46","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","@tuax/webpack-dev-server":"^1.1.0","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"ed8d1a49d0578c18004b1954998272e525992677","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.46","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-L3+A5eJvz6Kpy98Q9RcWGRuz9SVX6GXcBNjGvaVWYvi6DNW/eMlsx3GEvOhWtPeI04C9PQENVyvSKVPJjSanxQ==","shasum":"a75cece967b196f595b1471498dd207e9bc18383","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.46.tgz","fileCount":82,"unpackedSize":543823,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdX/IbCRA9TVsSAnZWagAA95MP/i1DYIv1Zvsk2TFjB4nJ\nRRt1vwbIRI5XrDGJ1MpH/JJtWTN6xBr2SF6MGoik+D4MSdqvngSxSkOj05dp\nu5rNyQaFNP/lIPvttJjSzg6Hqywkzx1/QW2HwbBU84JSBr3CKN+bTHZtBhYf\nROCJU3mqSs1S7pH7qETdwPtnxbZJkgSKTYkmeVKAThA9jXTjyNtyMAHktD1L\n1AcvgHunWxLhpV7zJgxbblCYvh9ip1JqnhtY2R//fOdJ8EjA0IYJAZp/N+h6\nhsPAfm+OO6K11HgUomw4+KqBMr70pccRtH4II4QgADVByuYwmpc+BSLBt9be\nUQXzFvMXI8dNsMOnTsYhob3GPNXmz1AQ7MR0VKPwprbisD7L2OoDlHKgO9VX\n9YgBAZp+xEIbMwHHhkW/wygMcWUXxCjCktY3Q1SmEU4HEaSi9bwlGmenTLp1\nbqKiKAiY68p/tr729FWYeKSQAbK2KB/Cm0BocownkMEnVe4viaxUKUo+oV0B\nxN/yYOhZ5AV2B5fePu1YkAn7QMcqi2UF2UjofzPIjvdbf9/v3RoHlvyERkUD\n9UbLBKYvk8ebagFSKknneqdRcBoTwagwS+bVbxpCc5TFG7jfssl7T2DrbsdC\nEdKw1NH6VixJtvL/IFBaxjv8/Fv8pQhUQxdSFc5gKRFPvI0mKOo53KjYkuth\nU0tu\r\n=TxXP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdAoAHbGI21KNLsTVGYqq5jR0WTMB3KFFSD/V4juvrjAIgBjOXR/VHS1SU71jwaemEt4PA4Dz2CxsWgmR0goXBL+g="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.46_1566568987271_0.08375913773507837"},"_hasShrinkwrap":false},"0.10.0-rc.50":{"name":"tua","version":"0.10.0-rc.50","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"acdab17fcd939d8d3f879f54af2aca84e9f37dd3","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.50","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-OXdUHh+aQMyyyvkww9ve/gE7EuP2AkqsXR6niKLrxsbmUBrafWzHTehqEpclB/LPs3Lz84s/k67jNoMwuwKquw==","shasum":"2e93cecd8b065b9719d50d15c6ff3bd9eed3488b","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.50.tgz","fileCount":87,"unpackedSize":571362,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdaPBFCRA9TVsSAnZWagAAebwP/3kEjxp/iszA8pwN9Naa\nT4efhwPnZ5aD9EqNDzqb1JmABGc8JaSJHynfTT4MMnd7tYYcHqZbx4FBaZQI\nrpjp/+ViGyFdJEkR8IBsB74a1yhyDmYkfhJDzskz6fvHu+yzGRmmovVTKLiP\nHzXJbICjjJSotrQMumW4ODo/eE8PbHOB2oyG+Jv682IBW36fDNeP6FHUD22W\ng/1U0LfMLScZQ6ZR2NEEFrXhCtvZCHYdRmWu3BeSrheDQGxL5512Zhm0oyDs\nwYexTshK66WB5ObhDNKdqA2ECqWSqt3+DC7sdY3E7dgPi949qME5q7Mexzy1\nC5qJ0k/vtrDnfIHfDr8CYBOgO6dfoBwkYYe9wfaIwm7yIu/DyQExDZ/Dzvwa\nXD5EGcdwO+Js16Tmq2gHSKPHMD7rdddU3fsC+Oh6QVoro0i6RrzX7bsKqOLO\n0kPZ5Mmjcyuc8g3Nx78CdBb237Ix9wpV5YIs9703ScSuQLdgNVzX7YGk8vWT\nrWwa33oexWHtZG0iHMXfbzWjkpeWg81BiL6RIOAa255xQr2u51GrFK4Gq8MJ\nveFmXLJNRHJE+drGSF+mWch63EAI42/lHIF6uRYXhgLDcQRNPotEssRyhGTC\nshY0D6cpQcecHqX+NZJv7dFgNicB6lIoRDVAaHDZgu0qvtMZS2UuJgVZM7A6\nTtTi\r\n=bLGf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCDMVXajLRcTzLJ9Vf71qJfQ0H/QWTb9C+vRadph4CHUwIhAP7C8tbQwkXVkVOgpQGO8yRw2iZL4ul4QBAkx1nyTn8z"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.50_1567158340430_0.4486212188147245"},"_hasShrinkwrap":false},"0.10.0-rc.51":{"name":"tua","version":"0.10.0-rc.51","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"b3a6deeaa00c21ee3d559772fdae8d3e17e4e07a","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.51","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-SxScZIGBSThKSHeNYurg2VRb+kQoHDvWbP6uC3t0RV/hUAIdCCIiKUrE2JNh8eYPpXGv2K9E507MHDrrUw40Qg==","shasum":"b30cfcdc45e88c53a6447e3c4520e9995f22e5cb","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.51.tgz","fileCount":87,"unpackedSize":571419,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdaP9dCRA9TVsSAnZWagAAYCsP/3vSATvM9hpoGgxjMLbV\nKUSJJpbzv3nu7KzhhUT7m47kLgqT72GjROlckCrybG3N2mPIKW26SVczL+Ku\nGHDBBo2Lsf7DctV7+iAsWAlkYDlHIGQTHDlP6FkNZpMrQhOibKJJCFm+zTd8\nmREgxSLUEbEkohGzr0qLdsYOL06gQNtB77iaBbFBIg0tSoruFlhmo8a8uz9N\nwCE6+qEfvtB/mrVLiZyrEzyuZox+ujwvCqNFl+EYMwF3yoMa2wVnVynyTzQq\nVm3bmBrwz5cDsk/4pstW/svUa+CwMIImkTzc+96VhqB89wntm04zI/wGihc4\nL1sN8Y3MRCIX1Jz6qlfPm2+ithvjEdmYtxruO+sYHcHfYU33vr4Y7yr+lagZ\nOMjXMxeNp5z+PHYqJRuTP0oij7vQHA/m9qDFiA/Ga2IXHTxebnccIj+JhMX+\n0ytfT2zzjmIeZ0EkIO8LsQuHmH2ONUTpDh3Kx0kOpfcxWgPpTIFt7HEQq4HS\nhLYg92Q0gLkf0JrPNatmi1k6bqdksD/Luh13coBi/xuGPGvKP4zNdx6BKP08\n112jgr7NEyUTcBXt+v4y/3QaO8VO+7J4Wn33J60YzIvDoDrgn3MAvWEarM9e\nONrmUiwSIPBR/tlDvJP6MDOXQD9jBuFL/QTnJpy2pFW+HX0vwP482lP5DKC2\n3AOj\r\n=huT4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA/s3IQ/1Qi4qfsDVskHR8MJsdHXgPIi5Vo01tADP+B6AiEAu3HaBa7ZBNDy50bThBt12Yvgll1uR64UvZcx6aMFC30="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.51_1567162204524_0.9090983082929442"},"_hasShrinkwrap":false},"0.10.0-rc.52":{"name":"tua","version":"0.10.0-rc.52","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.5","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.39.1","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"40113d28f33e68fb8143ab4a8dbfd6f32224c726","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.52","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-30JyCHcLGHlKOo7Z34hpogrn7Jc1zNXwl2G9P7GcqKFbY5dsIwHNmWFptpslB/ci/QulzHQb4cjtl9VCTZI05Q==","shasum":"c55b3bf23d76f09e90c13b1322d09aef8706c0d9","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.52.tgz","fileCount":87,"unpackedSize":571586,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJda8pHCRA9TVsSAnZWagAA1d4P/1A0W/X2dnOIhPk36OTS\nzXDzwEbA7hAPKp/ZQg1pgZsB2Py/7O8FdZy0ociPPPbnHS/pz2uJOhIt/eNq\nPIbnSxgtlkBMGh5lv9DL949k3V9cLvs14W0D6ESJODGSQgnkagqzPTFom5kr\ntEWZ7yoB1yZj8v46lGWIEIF6utp+135YVEFmq1DvhFSKirzZXZq4fiyqaQH1\no3ib1gPkEJrLaX+RNK1cdItOLS4PPcp88oGdij/jM7y53CoqgMAdQuh2bxcI\nGvkBCMV+st19W4dMH9sM2olGt9wknoZ0woEFVem6B7af2U7N0ZwI1ChoynEg\nMEXjJ09m1fHWZY2W5USkam9oaLRj/P57VrJtG+tCPgOeWupkPAJK1/+OdR0C\njvFZbb6aYuIUceeGX3E4tlqzHcBkllhp6GwIf0vZks08XSqaV03ldu0diL2Q\nUhU5C8bDkZj21UQrc66eK15Wm1OHpz+CSmHVeeiGft0BtKUoA0mT98C6sNuA\ns3r0BfAJsSe2Q/ZLzD5wMsp0NWraAy6ZD+dh9bwuNGIrXyVVtPPxvkYh5If1\n+wyVTbI7PBMtrIE2TUAegATilzvbj0XDChAmTI+cFiv7YUCvG4pbt4DvjGWJ\n0TWxeJOUuD4Mqk5aM5LoOYMifeXfWvD7a8wIv6nBP9Ujr2UYnu2PBDVHxsld\nhT52\r\n=/gHJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCR/RcG1V7N8SpF+2vawwyCe00P0bwagacpuOLB4YfnkAIhAP+1sadJ2bzRgl+ZlR1ngubSvUM2IMbkVqIwWJ+y5tYg"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.52_1567345222683_0.5824650949551948"},"_hasShrinkwrap":false},"0.10.0-rc.53":{"name":"tua","version":"0.10.0-rc.53","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.0","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.7","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.11.1","esprima":"^4.0.1","estraverse":"^4.2.0","file-loader":"^4.1.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.2 ","url-loader":"^2.1.0","webpack":"^4.29.4","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.1","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"db9258d04f81c3602c93799896b4fa8fa3e39224","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.53","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-V7qV3cWHrj29lo2Wf6eLIhuHga60af4mQw7NtLoTfcocmbGOe9psBKRhOjWcIHtwgWHNh1OHjNre9G8BbWHTNg==","shasum":"56c820d6c35ec36bfdbb92d7ef4575f5b395315c","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.53.tgz","fileCount":87,"unpackedSize":571714,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdbMHACRA9TVsSAnZWagAAf84P/2LBWpm6wpXPXC7oEx7D\n3Kr4MUCrFmGCOy9fWOK95ltX0eDFZaK9x17L48RaqlwPIeJzSzLENdd7KorG\noOpWNEWbrxat41DTAx3i2MNOt/yvw+KInKDoiWi0vTW2qDACB/a3RvMIksyW\nU3Qw+xmEgyT38tYBsXiNciKLeOR03YsbjEQ3WAFzcis/MLBt+xYT5RcCTU+m\nziKZzOMBaqa1b/9eifz/G5TH2QH9h7iUnWHu8Uz4UHRRt4d0kPYSqtS8D0Fd\nbeuXe9kA/d+fsvnJZv/cInu0RcPlvsHEVig/u6IBpfc1C7+pXM/RYk2zMMmM\ne491q+QULA/LP60a3XtPBKm+0jtAtb4vGTIK2CBYM9hcaDwmp2pfilHV/UGa\neus5sD/W02JIrk7Spi4WNG/rLRnKRJ5R5PmAq1jXMrjn5j11ehnk1wQuz7px\nqXvMycVXLlV5cUD/piBBXSt9lHdmTefXfCj+VbkRuJ8AtHH2IXWvxGJBIj+R\nKomiVEBK61gT/japaIXSPoxK0p6cov18rqkD+0eQR5hin83RU668Le+wB21y\nuN4UmPKxUxUoqbshHnQavFrTlFaFkpkZ/iT05k8V2tlFKxa+jPXxY/Yar80b\nUWZ9SKbK6AgZohWWSayKONkBvOOXVLIxAjwL3Ta5/58AZKO1/lYqkhc6Dwp1\nofaH\r\n=xv7v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA8fNujK1Xu2YiH0iu2T7LlO2eLuQFJoSjgLYX7KSaDEAiEAw7zJ0lwjKItCgsLDMDBSo31tkgMWcIGqEfj/5LPdHxk="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.53_1567408575377_0.3032439175134827"},"_hasShrinkwrap":false},"0.10.0-rc.54":{"name":"tua","version":"0.10.0-rc.54","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.7","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"db9258d04f81c3602c93799896b4fa8fa3e39224","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.54","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-Pb8yjyPfaCJRhs0zttJ6d2sHg1POM7Lcd4mdJL28KZObGQ7j9xZCpw0NbNZB4aRKFMfQj6rewSqjiRbK8t8alg==","shasum":"2f7ba749f9ef6cfd462a32405522fe864573c4fa","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.54.tgz","fileCount":87,"unpackedSize":571713,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdbPgWCRA9TVsSAnZWagAA9vEQAJqvJcbQiwwcN0ApUB9y\nBd9vYDtlIx+lmYSYlcnyVTJ3aYOZt+swlpV8BeGdQIE8JWzGSJCrLCrFDslN\nMOCXby4C4A5i29AeZ9IgC0gsgCTyqebF7qWmtgf2oKU4NFBbg3+A7roNLVg/\nNJn3NpRlJKGz8g24ceJHgDgLPuXGRa5mY8iyDkx6ZyXiD5PwwU5/Ura3lTWe\n4UDd1OsOYoiajT+pPjigMBNviqe1tvtZg3GMqx+tjxFzZtMt+Ya90XRlh+pA\nkebq3zf12vsnK/Bp7cLugTXlkDyYE2rd9dUS3y1GhTM9GuOlkI18a1hpQ1wW\nHMGloqBTyem3iC0jEoLaoQOuCv+c2oGSho304KQMDCJDM6yasqJWGTHbMigk\naYbefM9oGe54iGALejJmN6t1q2d0Z5jwIOgtlVjPkyjgWQ1X2LqJ9J0IqbmF\nPTkpbK6lYzp7t7rxt2EXTeJS2mQfTZ23oHzhuV3bctCLrbCJwOvG8ia1ko52\niL16ZjtTMxzcjhJwrfJC2q8vgInVzOEnhfWN/VCyjpJTjrBOhu+3kxkFNQdS\n+TVfawPq8746fx89Y/KOL7ltsPyWb7P91Y/DCGj6UjquNRDN2bfBcNpXZEmr\nXzgejmno9RXRRs66mw8sMZH9GkZS4kvC6KCKu2yIqqP2Zjh3HaxCxc0wviv6\nj4Yd\r\n=u/zb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0hFVtjUQUHHSuNC0TupbEubm4iN9OH6hvd7O4w10g8gIgO1doVxmlyLw/0H1m49+yJnXhwyJBHwZ9uVbxX+9tD5U="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.54_1567422485906_0.0704575415603812"},"_hasShrinkwrap":false},"0.10.0-rc.55":{"name":"tua","version":"0.10.0-rc.55","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.7","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"3a6a49746da770700ca73e6bb68080e55ea87ab7","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.55","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-X+N4jyA+1utNsaus8Q2rS5Sv6UbPwvzPEeIrc5BHPsbFjUCciKOFWCgdlyQHIzfDJoMXh1feo51/ExgOKnvXDw==","shasum":"66a730c022a996d8111cca4f757ac0038136163f","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.55.tgz","fileCount":87,"unpackedSize":571714,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdby94CRA9TVsSAnZWagAAO1sQAIJImT2p4EbpriDwv660\nXeKBSWbX/ShY0CoxqcOwLfdtYzs9pAfdrpndh66k2/HwpSQ39fsQPK8CT+xp\nClqt4E9Q0/lzkuFu3PJhPJT479T+ApI+Y9KEujtxO/ZKH9WcvXpx4i4nfk3I\nh1iLiQ2mNapSpf74MX95RDVDtNNnS9QKMrvQiAME7sv4HT9z1bc8BHRtH0kk\n6WfRbYrYNbgbCvONTp2uEJ1BS9acLDvlvzrgZXkaNCpfHCTTOpDfuUyFRwxQ\ncvrqq3fppBF4M0q30oaVRLyK8HE52WDrRiWpCGZSsYIwcUG6lACQ3faw9kyz\n+Pf9f80F9idaKr/JNPAye9fKDyqJQLgc88VPiYzYwi3a4se7eiEd/5mmAplN\nec+euHorf6JUmwOtiC706DLxR6oGzldhcQ8FPTdDFaelrQc92WoYzQyw+i2F\nmM7TZgtsZg/ZpjvZkHJfKbtBl6obUhY7xChg3iwmOINIPiGPMXZf5ACBvUul\nuNvpzaws9v+h6oKjQhTGeknTD4CkdaixG3kSSn0cnd/lHIoZTeJo/HjKksST\nja4sti9BmfWk7EZjm3R7YBuYjR/j6TTNftt5V1hH8wZlTUm5eAI9gqVEiDMX\nS3fjQ6bi2z/Rq8MtmXCOKqcrDlnrAY/sD4/5FlcoPVwnPgoybHZeUsT0qmNM\n8CIs\r\n=gBfl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID/SnP/rYGhUz7mAGCLX3yGPQZXhIVuA+qRFYEX1ornxAiEApNEgPXw/QHi0GnMT+dfeaNGyG+LRl7wls7CQ0tiMQFA="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.55_1567567735591_0.08350658317198278"},"_hasShrinkwrap":false},"0.10.0-rc.56":{"name":"tua","version":"0.10.0-rc.56","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.7","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"7015ceedf4906e73504ca89f965706d3ad7f8032","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.56","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-3eCLWenaVeHrUHbVWC1DxUN6NgYERz6d83JaFDpc2ZAe5ABGTmRRLqC9YuyMVkMWiyaKZWtdxwtD7JY2I/AiLw==","shasum":"f76bfc25cd3ba6a8cc65e1df73878ff345d15128","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.56.tgz","fileCount":87,"unpackedSize":571646,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdb7s2CRA9TVsSAnZWagAA4AEP/ih0gZvN9extMkouDjC+\n/ymxDSQtirFHMBgUYDn1rwAYL9kpopodPdIOpOG9csyU3BjGrIvaWuYuqcIa\ntQ8+JDYa0Ad15fq+AF3qRhS5E1HVaQKRTuNyY8Qg/tvw6EZjveIuM3KvK36a\nnsx5bQPagyyi93fX1+V8celHsBQqXtwjMag9I+OBroPDWWinNRWkqfxiOe9E\nGhnheG6512DGXR1lgJGGuQZ5/VK1Tnc5tPVC0NNtXxVWpmNF1rCagqjGDwUk\n28FAZrsHcrgaEdUHhYQsisvuHdBQPjAvqD7mH2tPxxwUUnWQYtea+1i7C/8M\nxW1sNQe3nxJzNq4gaQumKTCmmIbsnJJD2il1QFkwegQGQ+2eMkkI8NiQayI6\nL8cHUQKitSPbQKRg8vvwjrYCTStOwtYtRMZ2FbGNEX+E9DbkFmBm9GVsID7O\n/lhds4UsPwp1x0IfS/Bj1cN6SWbl+2B2rIpwzs9i2zCb3AOscjA8De+HxNgx\nAHWD6F1/5W7Dv8lsSGfiG+M7hL5PBog4SQZLtd46X1pPtNRxcysagQDdk3Ek\n4U+s1ci/lYbXjR51YOxPzkgKCXnCs+w6Bo5mSyeob6bW/p5KZxHVmHOOCn/Y\nNSn6gtPgjJGBEkAUrXEGakmVsxmO3UKtoNJ/ZmjIJV0+dXqV21muI5IFW3Ej\nhxm8\r\n=KTQR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC1/nHNtB6u0Lwehppjke7EhTHzv91IKZqKKFvEiUsKBgIhAJTsQkq3hEqLvLcStHSsLX0Yia95uudp7XLuPOP0tsNy"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.56_1567603509351_0.552737964780551"},"_hasShrinkwrap":false},"0.10.0-rc.57":{"name":"tua","version":"0.10.0-rc.57","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.7","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"773223034e61d2224d5cbf91c0ca855268e1e904","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.57","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-LKByW+H/b4TqbKfTVIUUknTmUJ633cdkmU8Fp3/1Orme4pDqxMedjbl1XOe2mogeMYVjk3bE1ILT4VQosrRwWg==","shasum":"6c1cae8d3e424d6ee1c53f822aadd89bb713303a","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.57.tgz","fileCount":87,"unpackedSize":572361,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJddxGACRA9TVsSAnZWagAAAacP/ihUIdlwyk9VyDdgnOfn\nl1hULtrS7GThmYN5ST7Dis3gGelQkfvdxFjuCjl6KYYT9VBSkv7Tm5HxzDdr\ncfeUcI2crHkPMWBoDtGNBZ1h7DL/aC8jIUXg4JCCzEs7kkY+rTfKcENHt34p\nmJr9YKdyr0QqcOeNN5e+D3hbHUrGmHjPnQTRHXRnecs3mWg95m2vB4W3mrBt\nKyT4xPcW+nxIxGZ1ype6Zv5r2m0ILaq2nbSXfUP9WLUUK1CCLppks6OT+d/W\n0aEF67SxEr+I5rcxXjkz4P2rNM5FV1DH33es83oHH/WOhlANGSIAa8+hXXhs\ndpWMVdk3cZarDjCxIEc1QtbyvNoIa+QO9yIBE5I0qh+rF25qY7BlhAEvSuBM\nNTKT/t3g8Wp4+hPDcWZFku84abBEHw5265sDS7orzlUfwISkPDNUDXpjKhCt\n0eMwVpqoYwRzvQvNG7oDAHwozgLUPFike8W7FE35SVq7I6ONghtU+fEm43yx\nS4NNafedllsnVlct8ELndDO1sDeg4WXR04w9bkHMXkjTumur9L0VppI3y44q\nvJ9UcG+H27IU1gZoQzMBAZeQBheQDnsl/hC+ydfu89M99cDWPmqsAkp13jNx\nqyS/bVIbWsjy22Y80Db4fCsj50zm1oBitXL+TlkJhHjpkgvWmgFIWvWIIUE5\nvWRG\r\n=faYe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBaGaXG7fTYMR7hb8ykrK0yyZ5T2qv/GDjB8Np/HKlH4AiAN3y8PqPzncV9Sz5OfuUPvpsC3dYHO/O5nmAswq1xDjQ=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.57_1568084351341_0.427845655152608"},"_hasShrinkwrap":false},"0.10.0-rc.58":{"name":"tua","version":"0.10.0-rc.58","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.8","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"773223034e61d2224d5cbf91c0ca855268e1e904","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.58","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-8+MVmApScGQ74W0EJg6bKum8Xzyx3o6BoUojimdDqN5dvVODoBtyT/q0scv7zxHhrYoipaQTG4556j2+2eZ2lQ==","shasum":"6ab22d6f24822884b18c41390d96328c008f3b5d","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.58.tgz","fileCount":87,"unpackedSize":572361,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJddxIXCRA9TVsSAnZWagAAGpQP/RUlGWjDg6SFkmK1Q1zx\nWM1Jm2b1rMl2T3eNY8m+kZgcwlIuKtRi5oA+q0bBIjiwlLztEKlR95zzVYz5\nqwhBzUEBM8HerQXdIjZ8/GDP2xuW5pS3KHJNvQJ9QsSP4Xqahb1h1LUg8D5B\nHgiCAkV2rG9IZ+E/FHqrfBNjEVTL6znRCvbGCERfdaGacxuC404N/s/tC9vB\nH+MJtcOlqC6ixzbHjxF4Ow7f2O9qBvwkVw7TlFB1oOaqSbBg671pkacMIkdN\nyDovf/UksqMagRGZ8sugSFPg8zMggceKMknfKgkgOT3hN3XMc1HSw2vwV20i\nb73UC9akLKdQRSSmgoSMel6dBtg4aUQ55jsAhW4VWzNnVP82cEh7/oUGDTlH\nCSkLfw1Z/q/H8VJt5wBX5RuoHQX6phfDzdozljwhFbszuEW6gteDVlP9rlir\nFfNWOLbtUiG7FP4UCbjg6BlD0eU7S+SuQ8jAQsVeHZuA1Lq+nrBomj7jNS2V\nZSwj1XT2vEiBmP3CE/FSjH24Kcq0K0ka8hUcIh6ql2u3kjSC1XuAExIDMk9N\nN0pPiAQ0TlRjVFqRDqZ6AWcTTtyMwLrly6P5tHGvDY7I6toEcqZrYaOne3bC\nPpIuyDKQMSCeFj3wL9wlzTNkqLgONRXqheL6k9yNFj1ebwDTX3l+6sBsPS4l\nhli9\r\n=+oWK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCoWJWOH4eOcxOjCCNzf4sqcdUcQo7QDLUCgYZLxkY60gIhANMEchESDoLvFQ5Zykb31RMO75toBjScUCkNmidphPGT"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.58_1568084503086_0.5857521740428191"},"_hasShrinkwrap":false},"0.10.0-rc.59":{"name":"tua","version":"0.10.0-rc.59","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.8","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","gitHead":"05d3a8fed660908ac085765c318d3b58c07464e7","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.59","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-47RfkNbdC7OyFg3vG62Rc9Iv1pmRTE9DQyboeHo3Zapzcg6h7QHQrkxX8S3TbPmZ4Nemj1X3ZjNl6pCUC0cneQ==","shasum":"26ab05d07c2962014cf998e40b182bb535c1da2f","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.59.tgz","fileCount":87,"unpackedSize":572191,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdd6ApCRA9TVsSAnZWagAAcxEP/RWmi65HS6UOlxRuxKCS\nbnm2FBpvUlQdAQk3ISH0qOl9xMmafJHul1zB0LgK/0xJAZlf2UVKF+g57Q+p\nnggFUOODHQlN0nzeM/T1QgHiKdXx/P51+sWhw1KdUD2jvRmamyAwSONb/HaB\n+WAr6B2fzLwL7b4AJL1I9xtzE++wyHkymlWonUuAqHXs+PTww/jhfh5t8BVD\n/MzvLNe/LMNh+knQr9jkRsbCKxnJQ9n2zddkxpe8ztRBsGy5PS4x6k6fR8yP\n4Uhhn9BzHTYxsOxrt2yZEjyXp6qCMDNRFZeAWHlKIpJaxCM2R9LuTzafld4d\nwq04vNiRDKtKDw1Tjmp5VA13snfuZzvJl/zgb9RVs8+JrOMV58giJbRpHFib\neBx+WX0mS574k1yJRP1G6Gq9JR1B9RJNKGRkCO8upT2hLqj18VaZDtmyJq/F\nP9JvMmm/WWGaA3aYl1cHRTHSmFyqK/SgBNQSv/Yu+IVKKp70lzKdoSNlL2nl\n5h+TinZZNPvR4WKG45u0XxPr6ZRr+lHePkOCGm5DtPa3Ywutw9wjlhNxd6VN\nATBVO5hh+vIZnHpZDMwcak4wRHBG9f4lyZ8EMZjWceofn4R3CRh1OVupEh3T\nTuT+jX4j0Bdw3qJCu8lhWTOKELMeu1utp+5wE4herLaEvDGD/7YOI8HURwmN\nlK8a\r\n=DiHb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDgHmWTVImPNa+hFq1TtJARq8tThobh4AA7iSofUmcRDAIgAti8Q1DHswo4FOzmgWXTdMfDlQVD5c3gR6fn1OUTca0="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.59_1568120872910_0.3467592758012419"},"_hasShrinkwrap":false},"0.10.0-rc.59.1":{"name":"tua","version":"0.10.0-rc.59.1","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next&& rm -rf lib","pub-next":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"cdfccdca67f7a5b85ea25ae6bdadba44d0cefbe4","readme":"# tua\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n1. 通过 npm 或 yarn 安装tua\n```shell\nnpm i -g tua\nyarn add global tua\n```\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n2. 在项目根目录下执行初始化命令\n```shell\ntua new\n```\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n3. 开始调试\n```shell\ntua start\n```\n启动服务器。\n4. 打开页面\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntry** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntrys: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntry**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntry 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-08-01 v0.10-rc.4@next\n\n* 改了若干bug\n* 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n\n### 2019-08-01 v0.10-rc.1@next\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 约定大于配置，只配置 pages 即可\n* 新增 devServer.localhost 可配置localhost 映射地址\n* 新增插件支持\n* 新增webpack链式扩展，chainClientConf，chainServerConf\n* 新增dll.usePolyfill，可决定是否使用全部的babelpolyfill\n* 新增 .tuarc 配置校验\n\n优化：\n* 优化配置\n* 优化输出展示\n* 给主安装包瘦身，安装更快\n* 优化命令行速度\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n\n### 2019-01-31 v0.9.25\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.59.1","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-UYq98U8/k/44Uy39BEbz3of7s9U8Z1mE7wm2roO1be6798s8BHF6D0UH/2t5IpOGFWelyzzSmfBXA4i7I264cQ==","shasum":"3cfa096b72d9d83f1d15bbfda426ef0452ce824c","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.59.1.tgz","fileCount":87,"unpackedSize":572021,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdd6DACRA9TVsSAnZWagAAMVoP/1ZkhFGl+C9YMQYS5n9+\nlnzIo4RBLpi2ZVyEAOEDa3GGLU5LqfyafWCpYzD+W3CFKUQmh+/EyXv7bJku\n5kObWzj39vpG/idN1szbIR/pM03bvcYOJMFpv6u/hzHEAJeODpYI1NsoSuHd\nOhPMWlXG3fXIiLpAaDyZYBPq25fgbds+y5R8ky3GyJ6Kx2VMbf0RlodRJnpW\nmXmtsfdQCctykMwL3LjYPiKENxGvG3aLdIuMkvEadeAwiD7NpNckiEiUcVdF\n5ksHw6hw4XwpKIUcPLEm8VchhISbL2Tk+MknE9ODQyjHDZG083mT+orT91ri\nCNlu3pFdcT26ReDH3K8k9RuoVuQkjnWLTfbvXwyIBkRmdiSqeiPICmQi4IYB\nCBWWFDfosMHVKN65yXzx9ZcVlE2X/cYpfROgd3ZwfxqYHB/k8eOIVliZ4nH7\nJ2349LmkymzJ7Bvr6EksRVJEWKqFrDXE5UGQ228i4Eh6ulwiiqcSB7wvlgDd\nGqu70ASFSjJ9KYfDvaJtoI4U45MGY/Bp8aMxVLx4AqJxE2KY3WY5fwCVYDJK\nh+zvVjEmfg37qabizYdkq10JcuCwqmo2W+kddDbiAiHG7X4FEH+/kaue3uO3\n5wQHhyQbQB7HVZNTMPx4rdPtkaWswJjYmZ3x8L5imbV6zd8+dBBelO18B2dM\nkgzC\r\n=r05E\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIErfILC3BjdM3dbAfZjEU4RT9bVEy8fooIPNIuI3td61AiEAiXkDIXYbxr9hvNJAPXxSb6l8OnxnnVRrwq0IGwapXlI="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.59.1_1568121023881_0.5058781061106761"},"_hasShrinkwrap":false},"0.10.0":{"name":"tua","version":"0.10.0","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"fdaa07f7ea14a008a4acd89ed54e94b719a8fcf5","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-aFQKkPV7n1WwizuE2UzONGbtfZUwAyOP2fACZ3fEJ0hdKqaMSMTnHuj1DK9QCRubNJKpQEZkKEN9036t1vinNw==","shasum":"10a6dac6aff7ccdf7c7ec1207e64c3964c7ec097","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0.tgz","fileCount":87,"unpackedSize":573816,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfjehCRA9TVsSAnZWagAAXGgQAIlVYwiobYWLtaAaouq4\n5xq1BcXw/MsbI15okprS0BxsP+s5JMd7AktVfCGfzPATDGaAXZLE0Mjt57/P\ndeN0CN5+DXYMhzlBVvZO/xuZAp42Ih7Us5cqhKr4MHhhn3t8wnOmFEpclcsl\ngcx4+VqpxxrCiHDvxlENl9PVAP9cx+HKWViMcB5XjjaFPbljHJvP6MUnQspm\n7F2MQkyT6neFB6uG3ryztDJ13pGPL7WFPVUmNYrOYcCOZLDfVgfkV8k6fY2J\nhIjINPkUkcsNmoYubGyRT13XHvSPYwMLzkx95xLyIxNICcwIIo1x0mlaofZG\nHVRkZIIWmwROnMVXnKnr5C4S8HC56L0wVLr1Tlte3jNG0LKl6iaj8s1k1vwv\naphqPQfY9tsnz9SihkGv4tOvgoT/SEu1COnVODpBioINwNSajfhwLuq0O5ZF\nSJMbpQ0gdoTdPgV66WzViX83zE9CfBuNIZUsHksbmNlK1AsKC1H+nT607rhx\ny4H424BPBdarQxOxIwOU1rvJh8MjMhcluBs4qX2z1hKMnGmBnnIIBlCoPv6V\nG9Fr7gTtoZ/qlmjPPkrYyvhuh1Wrk4/nnxmcusZJocPtxwZxmRH9IgfoMd9F\nF8NG2uYei+iKmY22iCTpQ5ABT3DNxevNEh3+L4579/znhcbgoi4gnb0N8gLC\nXPzy\r\n=I8nM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCJxeX7z5EIjffVKTBMe8o/rXEZvfV0A1oc104SIoF0sgIgHStEkmBHqUymdxlSgkDDIjymhbWh2992yWgTntkd9h0="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0_1568552864830_0.744259237593752"},"_hasShrinkwrap":false},"0.10.0-rc.60":{"name":"tua","version":"0.10.0-rc.60","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"610dc9fc62bdb36470e2f0ba457cb2eecfb77887","readme":"# tua\n\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n\n1. 通过 npm 或 yarn 安装tua\n\n```shell\nnpm i -g tua\nyarn add global tua\n```\n\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n\n2. 在项目根目录下执行初始化命令\n\n```shell\ntua new\n```\n\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n\n3. 开始调试\n\n```shell\ntua start\n```\n\n启动服务器。\n\n4. 打开页面\n\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntries** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntries: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntries**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntries 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n打包发布项目\n##### 5.3.1. stat\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n##### 5.3.2. params\n参数，可用于过滤入口\n##### 5.3.3. suc\n成功回调\n##### 5.3.4. fail\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-09-15 v0.10.0\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll，原dllChunk值可设置为 dll.chunk\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 全新的命令行\n  * 更加语义化的命令行\n  * 新增全新脚手架\n  * 无效命令检测\n  * 启动执行速度优化\n* 新的配置文件 .tuarc\n  * 约定大于配置，配置大大简化，0配置即可运行\n  * 新增 .tuarc 配置校验\n  * 新增webpack链式扩展，chainClientConf，chainServerConf\n  * 简化配置，合并了serverEntry 和 pageEntries 为 pages，并提供了方便的根据文件夹生成配置的默认方法\n* 新增插件支持\n* 优化输出展示\n  * webpack bar展示进度\n  * 打包成功后，展示可用服务列表\n  * 打包后，集中展示所有错误，便于发现问题\n  * 新增 devServer.localhost 可配置 localhost 映射地址\n  * 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n* 安装包瘦身，安装更快\n* 服务端编译支持 HMR\n* 优化服务端编译速度，忽略node端不需要处理的类型\n\nBug fix:\n\n* 新建项目没有 src 文件夹的问题\n* babel7.0后 treeshaking 修复\n* cache-loader 等缓存位置变化，没有及时清理导致打包不更新\n* 开启 MD5 hash 情况下，动态import css问题修复\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题 \n* 修复 htmlplugin 中变量无法被解析问题，使用文件的 watch 代替 raw-loader\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n### 2019-01-31 v0.9.25\n\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\n\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\n\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\n\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\n\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.0-rc.60","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-C9a/QWBRlrXlgJEi/YgU9RC1nChurD4gVr4NNtaDjQp6i+YSMpp0Mi/YeMiQ/KMZdgFdZu9PHeN7CkSUMhvFsw==","shasum":"079f702c4dceae38996a9a0f261cb23aa2c0dff5","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.0-rc.60.tgz","fileCount":87,"unpackedSize":575719,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdgaa4CRA9TVsSAnZWagAAyWoP/ivsoapC94Vrn2UK2AGU\nzznv0LnjPdJtYCUBC7QzEBfOSNdrzxxzHEKVlJYZqie1oWB1gDo8W4dR+nTE\nbIYhhLAjkWzspM2ZIV2urwDRGlo/IYTpwtNX/JNhbhmQZ8a6aiMVRuK6aFyq\nBCRub2BAjV75/fCcNPDJGutP6aXzZYIbVkRITxLb+OR4370QAXu76YRcJFq1\nlZnnukaDd2qa74be0PIk6g83CZlq0+p6eN6+NosswkEm7t1LaBg7fTpjibwC\n9ALCPpzn4WWIaN3eKiPvipMmpzTIdKDxBKk/t2U6CvyYnm4mOM6JtvCAapgs\nNVZxX5SqlBmsl2aV+TERJVvMvDsdhthRMEYlfVLd4smwh3Y0Z0RDhXnAHx5Y\ncZEQ4QSth5yvCEWWRHKvF9ZODFYqsvKI6UF9FvJL3PXEQsH/78XHGRU0I12E\nUIHaBsK3xus6+XvpvNAAQyJ81IW9yB8VacjTcQWWkJvIhqtPXNTcY1I+5/1j\nkyqnxIeEfmstc+IYtcuDP1spmXysCwiD35jcrYzszUhZMmL+aU4eupKdK5E/\n9HehjmtaeeCweEafX9TlBwk9zMcvJ/nzUIWBsXHB5UrbWn9LTtCSLFsZuRQL\n+LTkSxf8kc6LiQnScR2m1YbLVqx/ThJoreMYlP7zhnhsHnRJw7AK6sCJFAfK\n8jRS\r\n=N7IM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDt6Cw6QjZmTs9oO4VRIKt9HEREFJ+Va+ssTJFDVAfGRwIhAPWN1K4F2TrhIeto0v5LpawMVTjxYZ4yEzDCqagXv1mR"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.0-rc.60_1568777911868_0.8507345424938277"},"_hasShrinkwrap":false},"0.10.1":{"name":"tua","version":"0.10.1","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"83c9ea57b1f55510617bb5d5e3424b4d4019c1ca","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.1","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-MLee+Z7k0nASionaxwV5K/WGj+FeKHveN1FTT0HWpKn17GQdw4tn2zpgyHHDQLZcuUrHyb/nwVa6P81m5iK65Q==","shasum":"2447f3a682f38e6f557823fb338353629c3558c3","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.1.tgz","fileCount":87,"unpackedSize":575433,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdizK6CRA9TVsSAnZWagAAc6EQAJ9Nu27x0q5EFcYlztsi\n7ySiH1ZmAZHdBkwxk9vmBzTacR+ng+iOh+QkpFxsYPE/X0MfkGiGazQKlvvR\nLH8WvHhHArFFC0iMEskp6R8k8MHB6P0Y2CTQ9ZF28AFHdYN8OVPcXexS0eTc\nC8yWfQk6qYTsqn/CIiZMBcmpheoIABV5hmlVx9XBtam40lPTq7BArC1Nx1Hq\nHPLKp4hbqsvu6PyGYCkbsAkFelqStRe+0J69Fmebf+DxvEQNczFOz39TEWOs\neRvEI0j1NTgvJd8/wCpAwIk4lTd0a0ht3+Qxg8uCAEv9B+jiRGI2mNntRDwV\nkGXpsjMmY0Y3QxPU/BqdPS+/nHECseg7eqO9hsKwBuiQmfaZIU2qQjRcn1zi\nSCoeyQ7ZesHDXC2D/I+sKeRHdTxi5bp/JhjyYN9UYmkCEQX0Tj49akVB5LjU\nblgE7sd8yjVff8iteCmVmjArZkumC0TNJh2K/o/zQa4hat5Ikvc+yz+0p1Kj\nitV8G7PZOkVogmoVsaH4YsyhiurErLGD+mScKfoQTsAFKjnOrv6ynnrB2SV2\nnFOg6KsueHtC0d1AbqtAKaLZQnChhb7z6Iv9GVZACDtwJFLS5QOSfzBacfzQ\nRGgq35KieOkzXLEC548cYeOABURz38nKuE5/qt+rUPyzk/Ra+cy73htPPJdj\nyrFw\r\n=7skO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFqkz60/Q+4WoO81fiLSQ/uMItw0dFRsgiDroOppf2qYAiBCwujJQ6bbWGmZQELC6mY+WDuRZ4x32Sn/0hLfzxbnOw=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.1_1569403577676_0.6773350502188835"},"_hasShrinkwrap":false},"0.10.2":{"name":"tua","version":"0.10.2","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"de8e55485210b7fc53c80790f2a0d0647bd1fad6","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.2","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-PwJw+awbuhwukXp9h7Z8fE6GlufkmZN9hJS8r58wj6Wc5XKrDZC+jHxkFjqA7Iuf//svar3sAVmLFxUEslT+LA==","shasum":"2a012b1e27ff7a0f651f3dcb7032fab1549da446","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.2.tgz","fileCount":88,"unpackedSize":573937,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdoESbCRA9TVsSAnZWagAAfnMQAIg9kN6iC3j/EqTSgbZf\n/pyw6Jlw6SAmI0BIp5ZuWafA2h/2SAoM/92f5I7SowucKWmC+3vaVRa18krI\nXcgAFhfqP+o+oKon57/RYZCF6NOAt6xU/yIefZCFe4C6VjRzo0pRZ+0MyncC\ne+Jw3ZLudFklf5031gVwkcKSGtV2HRKniKmoWfXXEJjdlQAdUq9L0lCoeKGM\nc6T5Bt4zdM5WtnRNCFMDFMGMDTXIy3WQrOJPHpO8Vs2pOZrHwmdoHtFmWtFM\nuT1TYGg3rHHA8s5I8YKnkJDmv1yNnQoOVHHSYVplrvIHO8zldnZ+3QATOiYr\n5CvwFca5fJIn2g0SzL2eSY3I2dTOllJ/hcWPeeA9zvSWAtgERUYsKsQjKHAN\nLBCVSg9imKm8T/B5RIVIUfK1xs3/CjhmSHQD8dLAPy6n9ds1f9BLY3x5Zulk\nj2p71zOxe59fhVef4zniDmYn1sxnvVpMgI1rjzyQTcxB1NOZXeQbTBWNnAkO\nFbGhTxbowyS6v4AVHOtidOufDWP1T4TTbLLGXLw9s2C+ljUs6yhsxI2oAGIL\nOYZB6EZOSgjhPC1eLmx/1GunV44VpLNJH2HrVNzV039gFmi8OHhnNX4oLWsQ\nlXrkC7bL7OUm0zZ6sVPSS5X5pIxmx28M0pum6cCz8VJYu2/2zAa3tiq9tPOq\n4FPO\r\n=FaIW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDqupIZtQxSUd5iDpQRVyP45TG6NzpKlYOeWCYxpSaCjwIhAOv/fLByNBTIknIUbcrI3KaJjQrkOwOv9VF7ZhLio2jP"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.2_1570784410561_0.48372186120742056"},"_hasShrinkwrap":false},"0.10.3":{"name":"tua","version":"0.10.3","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"f60312b24059d73c1a3eba78fbfd4085bb8ebabe","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.3","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-y1TPW6aBxWxibNSo27Sq6jTtQcAQ0BIPLGFww4vrfz6bjRA+W5PBbQBSYJ3VMxJUAEr8XB9rUVGVjubJCR9IrQ==","shasum":"0aa864177ff7d857820bd700975994e83d26dbec","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.3.tgz","fileCount":88,"unpackedSize":574221,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrq7yCRA9TVsSAnZWagAAbF4QAKEJMz1kSS2v1fIA3eb8\nU/oO/tSlfml9OZGIF/4ubzEocWwdOjguO9IAGNKTJZ22v7diH5HLFljzvpoP\n5DLeeIzOUfyQBxOOwtV8bO+ycVu1EZ+tqVkBupNYDO1JXG9xDwjQQ7MlEDIm\nG4t2qlcDxKFBSdKvmP3+2salHIaKcpZwNNlhlPNldJ23ZMgGiLV7wzYRuN+J\n/oExvYAOM1bNlvwlXDZc/aO304RtoDV4/JmH56SAHU2XQaTKKjGXbX4NT8pW\nKFKcoPyHYgZ/vn6mhw298yLO2LZhSrmUhkikoihfQBf5xhVxr7Fa2bFR1Lq+\n3JALpDxfa+ohzrAiDkPRXvF0o3DhikOpjfF62/bZFWnVmcjkfhT6Z3dYqQkn\n2goFZo9MXWzPqFZ0BWIOIU5nvu46AAmtjdfCip840kCwiX4taoEd/mPSOcBE\nppm77SRrddcgWjngz9jkKuQ1KYxG7xVg6iQiPIpsGG+rvVSocWMsz8k4j4Pt\nAQ6sulc9Ll3YpB6Jn2ZledIAZ3CRI9rze+j/cItT2NSHOa492CgHspfyOJvT\n+4im+QpgD0ULUfHsJYqAzLTQfuCmOmGbj86Oov/fAzxu9uQx7uPzNKtB4nX6\nTm/Ib3+Hw/nhAZufFEvyqExn6ZB2c6/OAiijDsyIBJ0oFxXbqHslrvE2B9V8\ncZFj\r\n=uHIr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEX+ED6nuP3zUsBxofmuXxhkEB6jVWkhrx8n/ATpqGvwAiEAnfl5pvGNQ8MiGERTqZ9z6l16csKmm5Ro0Aq9sfYwzko="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.3_1571729137919_0.16775104321872325"},"_hasShrinkwrap":false},"0.10.4":{"name":"tua","version":"0.10.4","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"f60312b24059d73c1a3eba78fbfd4085bb8ebabe","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.4","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-WkJcJZXtu4PvG7wvKAYWttYJasE69vNngClV5OkTytJjMbUAs2GYSENC51yTgPahilr0WS2ccH92kHG5l9HOcA==","shasum":"f8e62e13df6fab43d7088d94b926366f55ae98fe","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.4.tgz","fileCount":88,"unpackedSize":574789,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrt/eCRA9TVsSAnZWagAA3xkP/jPAR3mO/h8ZuhTzgwfb\nfMGI2lB+460hYhN8CJ2H0L+dc3cZrhvj2oly6HvLHuB2oYJDE2gyHY2cU6aQ\nyIIxLzl413uUTWjNoKsY+bn137jAMnWYWx01tZrIy3l+nTJMy/+twjet+uRW\nrcRqhYLr+OGjYZKZIe5GyEWQOL+zZeF1olopfdYjhCxnGW7rVdi140KAnbfA\nkhOWPbN3ZVSx3JTvjHTDdfTYUHTLqseOHI5N+r783rRcEK/2OGGAzZ0bH5S0\nS6KRorj1AXjkJsM/PGLsU7h+hBB2sZipjJUzbXiq0pUxShgrUxRqMoLhBj6p\noe1L1rMAqtFaYi5dgDES37axEZy3yf3O1InLDlPiStzoexazcYJXRNeciglb\nzsZBmJW83nMgZvfFeBN/DAO2J8CIqXcGE9nsZ1mTBjjeSV8TM6HKOTcws0ZF\nskVPPL9lxANQ/LQLO9RDZpzrFMqjIDVH7IEq2o0CQtPyyYBELbLr0rpVnFCY\n6O6aok2v6+mbqXmQnDdmO2lz+pLo7VHnxqhPkKnJqxYeYPEtkkWR/JX4l8Sr\nCzDZudKsEtJU0nzw9iGUOGKXP5DVKZ8QGG/BDagZUGAriCQXBnzS6IGCcc2/\nY496tExkTQX1ovXVfmSFFuPBu/HXIIN+zMy4yioczeArpdDLml6nqLEiZDVl\nL7Lp\r\n=k4nW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBoOKraKzUrCic9oP5EUpzofW2JZ6X8zPvCaK2sA0tCxAiEAx48KLYG+RWgXEZp7FJ94qFR2tcKGnJW9/vJ+SpMQDlU="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.4_1571741661920_0.39323545400308246"},"_hasShrinkwrap":false},"0.10.5":{"name":"tua","version":"0.10.5","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"fc5ad1537aaeaf1a780aa06cb1692f9e7855bc5d","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.5","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-xH9qY4KX2U5yrsVOyxfAZaZ405ILjNi+PZ8Px/+qSrPkmIj5AlmN4IkF91L/tgQl3KrRXxbKXlTXfzqbY9i7wg==","shasum":"ce6a0678b22d597036d7daab6ed5b84c6cbac749","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.5.tgz","fileCount":88,"unpackedSize":575133,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdulrMCRA9TVsSAnZWagAAOr8P/jijY7g4K2JzqcKVqjK6\nwMedlkS1vJD4BcBO7WqvdvgavyU1jzBGvPG/doCIxU9Z3LxxH8lAHoCSVAZ4\npAQ34atrv6sUbIh3CdwiJqXdVpWmUbyD1AJi/T2/kGRtV7gmgrzHF2qgNWZi\nDEJXvQdWcRc1V7B2oTCvWuayTO4ITMWXTkkTI7t8aS4vjIYKjC0OUYEu92Zu\nEL3SCO8nQvUw4QRSg2g32hw8cA7V3/hAk+qF1jzjv7oCCDrwLmtabTHo2Ti0\nW1fM19bh7CaybC2vbzhAgJFc7Fg0JlT9LLq+ZES4YCrwtlgyRLtPExmqG1C4\nX+Wc1A3qa8oVu8YkHYPxL+3rE2hQy3R79MjHI718SSaZRgmuByYqQyiuU3lL\nB+YBC5LUOE8U+3/NTW8v+ZhsyB9JYPCPZTdS9K4aKHfzyOLpS9w/ht5FumHa\njNAPjqpC1szLwMaz4LkskShIokb4rmfrsvViKiSP3QVaq7y3r37l3HCNbiUz\nAz4dSwraeJl8FeeXQQwEy/Vd+anBeLEfi5I/yDwyhQ0XJeLps3zwN5RqcpHe\nWQtEgsE0ZxQt9w64gfVvKtcVgg8yZp8ONwrg/WzT0OORiMBVzG8KwMOBiTFD\nzsCk1pByGkTkZv734hoy22AIxWiywRcPIkNE4YpjYuQDJHs6DgexJZGCd1M4\nmXmo\r\n=X3H1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDx5YMbP6bn5W98trc71f0fyM08LbQQnILYOgtWwGnLfQIhAN3XCBWLNzN0NTPbrhGVNCTDZ8+l0RbGdYKVQ4CymZqi"}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.5_1572494028351_0.2738120494022742"},"_hasShrinkwrap":false},"0.10.6":{"name":"tua","version":"0.10.6","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.0.3"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"af42e85228ddf7b2124827fc7fb22cf0fcd80e74","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.6","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-MesG3setu4KU7a5RzZPsDg/YXx3drOU7A8BhANanm5YCRGwEq1LVI2lAx5njLLh8LgxUAL990JysUvFFAUDLzg==","shasum":"480d72dc7ee8950eba9274aa1f72ae2233eb311b","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.6.tgz","fileCount":88,"unpackedSize":575277,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd1Oz9CRA9TVsSAnZWagAAOcsP/32MT+ZFDzRV3LjdK+6b\nZf0osexWygbj4oV1NA93bGE5PZBbDqICNfuH64o+2s++ZfLwMs03X91FGlcC\nUN/RuXgKXUY8shsjx1tJ5cecuCJQAKcz1ANLO+AWlXyfWcOFcOmaE767Xfar\ngi6fG0SpN5EKBoMjrKe6tAeSdxizFMzwY2RWXAWxJjcpeUelr/ETiRhL7lbW\nJ8vaPDXYMpQR5DAst41WE9xH8ieeHYu2khyk6Lf7WXT2Wh/tTzbWOJwi5jSe\nPWFxACCrSwzPsMNWKoMiKAMJQtYmKvbrslCNgfsWeENMUliMmmc5N8Qs0wo3\nVebw+GTqXm2YPzOEsIqlauCHKDGglEqUQi3Tsf2lNweNKJRoTA63MCETgUf9\n/nxvY2x0q8AZDmT22SrdzCp6s3rdQY/omYW7JdCw/4etYzKPXlxs0Q+XSsyv\nMqDMiDwOsqKjgu7uyZ8DdUhgSKUABOpjExW5EkMMS1TsgmoFOYcUgDOW7pMd\nwWMWTCMcDIkhdvjorK1lSCWfmCsajKx5HviJIHEgmHCmKXxt2hp6hioEghJC\nnE3gI+SZBVyWnQ8qkClJvkcNlGKKGGSu6NAYyUyAiX/et98z65Qsc+fqiXz8\nHFG/NaZQI7hlQLr+MS5InJG8hHJ6I0bls/HDwE7XQpP7ehxuKw+h27lAEijZ\nXHp3\r\n=mhN4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEULaKRLC9lppoM9QvfOi6IXsC3qiauvZQXSVphFK5FQAiB1MXK1Kg2YAlyYiKDc4TGC+yJFXJsTUGE0O2etcVD1SQ=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.6_1574235389204_0.19560053268201294"},"_hasShrinkwrap":false},"0.10.7":{"name":"tua","version":"0.10.7","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"650e260208e5b90d4dc48a9b82539009e3aefca4","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.7","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-3fyd+v7UdcDNyPHkbxZrIrQLmUpFrdcZa3R+BI9eAtd819U0XT7dVj1e+66npVg3mJl4HBFYyeMC04Nhp+t/Cw==","shasum":"e00857013e8e60145054e34c0ae45c841c5e27fa","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.7.tgz","fileCount":88,"unpackedSize":575280,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd741bCRA9TVsSAnZWagAAy5QQAIX5iRSCj40zvW0WQFjy\nt3XtmxfCelvpZHE/Weub84OyreUuE55mijKO3wTsp1aoLGJULSQa2tEf00Rg\nf4FRLrNWGPhb1LYQBIkTIDEEBeTou5SbA9s5n4yWHcDogY2Ju27h6d4bTAhE\nN1WA9xwFo/vugiEsQh8kq7HH2MA7wIkA5Yo/iBI/Bae+sDmSSKM+V7OBvff/\n7m/XYYa1451WvhDWPL0AJaZrl6Bfj5VJFR4kWULxcbckf7D9IuRb9/TkcrvA\nWPe3RCucEuFlx3XoPFza23drHBqZWsqOdyEsE4rnLMyZjInc1p0LHrjqXTzI\nMBkFspKfiQmMG7g/+oq592Wh4xCTXc9au5XgtvNhC92zKpMkOyJOTumnsRh1\n4t+IAeMXApcWct3Kptt9RpAWMUnBwT+ehf2raWszg43yObLKY7tdUaN/zj2A\nkGWIrLoz9WuGJTOaXF7mLv8XLUrWpnTyvupiBzfNZurqB/N4zZ5+r/A52lgQ\noNC0N9ufqhJd/V7DY0uS5RaniNDa3pNwxX6+HNZNatZIjSjCmEEevZqxtLV3\nAO6wT6AqTiHWzuXqQrLpYkLOw29ENjCuw8SpW6dqRKh9aZJ/GgSy+uX1TA80\nzoNzhiUG2XdEH5FD+ttkwXYp832AfcPB6gDkgjp9D38vmq3daYvtnPfiA8jS\n0m4o\r\n=l4e8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHyhOYjFdUDEHkXoofr/yTyPorwuKALOIBQABrCv5mGRAiA7z7s/taNfKEiAunkwj4BlOvFSrb5TCzhdWyRs0x/2lw=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.7_1575980373601_0.1502102056882293"},"_hasShrinkwrap":false},"0.10.8":{"name":"tua","version":"0.10.8","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"22a1f46def1803d5e49d52e331e4cf3fc74b979f","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.8","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-/89K2Nb/4Bde/IZUMLxWQY+NioxxB1G1m5Xcyigyevb6G16NZ1dXR6emtu2mfgRTUJe0b5hqPH+aHyQ3GROUdQ==","shasum":"6f0a69275ca3b860daad10ff37f086c960d29eba","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.8.tgz","fileCount":88,"unpackedSize":575282,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd8IgLCRA9TVsSAnZWagAABd8P/2Wy4p5rhx9ChegCvVSu\nClCypzZEUc/UPZxmloUmS44T93Cw4lThyDSLjYX0WKzb9ywYim0ne2FtI/Ov\n8kXBYMaisHXWPGhXo6gPKsloKhtcS65xK0MUD0Of4OL1/kBYOJPCoN8t3c/m\nvyGazeJHql1YOpYyYgeGfQS9MFcd1hfRjHML97K47Y9ZJxjERGIeZAm5SIeM\n1Voa8ToOsdurPt+wVQ4bWXLicWG6EekwHK8W2jTwII5UItkIqYlyZr/hazMN\ntQMOQ98ULCb/PXAGtG/G8vczvcvWpCJW/TZGbuaBTMfHnoe6MSJxsxwfVP10\nIX6fuNhN5QAvgyehywnuYkE1JSNyM3P/YbEBVtuVMbF4sEpyYC02VW7uNBwn\nm4Wl5HM9xbaOO069TINeDcsLCXAGqk9Z4C7k4RX65U2vGJPxOgViFISQ43oC\nQxAlpqkEbn10V8stA/oah+z0RW6pGeh1L/V3hncRhG1YoXDIaIsV3S5if9wN\nn43Ktf5y1ywt6F8EPZN+bLrZH62YQmAH8bdg9XKigcfMdU8KUl4Ki3B9PudJ\n/ArEgXCvnUMPenNXeozhdH40z6wWUAmN5nYz0PTFgE/Pb1N1qqukRJAUdt3L\nuQbduPNH7ASOSJ6qHR1v+XNV7zLcIYoppJX46KhL0QpwHu5u7TYOFQj3mkD7\nK6mN\r\n=l8qJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAponAH7T7oP47OSVXJQTVRgbMRg9R6cGCOr3QZXvpReAiEAn426UgqF9WjQpWLFiFiEFWUmWUnfMlXW7CDgABDZ3TU="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.8_1576044554817_0.142544395633325"},"_hasShrinkwrap":false},"0.10.9":{"name":"tua","version":"0.10.9","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"aa6f3e6d492b4b37d15720d774adec0d5a3858ba","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.9","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-Da5NNIIN0V3yb5Lcced7etpHGM6wfyNktysa4zcNg6Sbkn/BzpXNSaefwStfATUpud74WKCuRYr5VcwRoyNzFA==","shasum":"6e31143a1cf5a089c6721af9f5f195f96ec1de9c","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.9.tgz","fileCount":88,"unpackedSize":575047,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd+Mk/CRA9TVsSAnZWagAAOxoP/AmQi2FZod6F3shDMdTn\n90tLPhm6HQubdYNC3cY6FZqFOvJmA4IlsIuwi1ntvySXUU1GJKMCOsHwNh5n\nB++suLd07oO4uRUTtOK08GeLP0BdFrVkXaoAZ4imijnKCVjx+ztfdIs6Tooc\nKQKkTEEp+YpY/nxmvDI/hzNAc8Dy7jCecLE/G6ymibO0ivOVcaEG7NoEjz6S\nV/K+E8hXNUY/QO7mM2by3yK/gLcAt7EZO+m8wf6A/wtUcEwAHxMylAdJGHxK\npQlM0nore1XMrbbt/GmNbeVW4eAyWAo0QDv+hYg5+z7h8FSk4j4cazKzzwt9\n13H3qp/uMFeZOVc1nkutcYVDqXJYm4pZ6dieEx3R1t2BpfNT9B0zkYFwlkeJ\nzJXOwEt7PxHWcgLGQIdbocYpLUtaG//Oh5oV3getSU5C3VDLeJ0DrHCAcSgy\nWFKw2f7i8lcIC8rjwZHPsFJNnmGqHfKjHFkI6Cpypo7NRZHm60hIuTU6GqQV\nsrpBnJJKo/3RZA2uBGOa03EYqsTqAaWoNK7NsWRrUpWqcmY5dBWXDNpyJLoW\nPejmqCih0DDc4sh907Jh4DtvVdujpj56qMH8z7j4XiJIJ4vuxmJHQ18r0P8S\nI1hj73XAQmaIBR/b+k2LZi+Xy+X+AMtAwif58eVahagvB49F6epn3jOjpCqZ\n2IVL\r\n=YjC/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBhL/uXR8JYPpb/FIp1cIYYsvoCW6BjMlw1ruJXZvxXMAiEA79c4UiqhlDPu48bZSsR++TqhEFoDdHYbB14XVz7RwRY="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.9_1576585535063_0.27607214869261276"},"_hasShrinkwrap":false},"0.10.10":{"name":"tua","version":"0.10.10","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hard-source-webpack-plugin":"^0.13.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"1dc66cc09a4f5e65c46bb8240125521f32e3711f","readme":"# tua\n\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n\n1. 通过 npm 或 yarn 安装tua\n\n```shell\nnpm i -g tua\nyarn global add tua\n```\n\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n\n2. 在项目根目录下执行初始化命令\n\n```shell\ntua new\n```\n\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n\n3. 开始调试\n\n```shell\ntua start\n```\n\n启动服务器。\n\n4. 打开页面\n\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntries** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntries: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntries**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntries 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n\n打包发布项目\n\n##### 5.3.1. stat\n\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n\n##### 5.3.2. params\n\n参数，可用于过滤入口\n\n##### 5.3.3. suc\n\n成功回调\n\n##### 5.3.4. fail\n\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-10-22 v0.10.4\n\nFix:\n\n* 修复只有非服务端渲染页面的情况下，没有提示url地址的bug\n\n### 2019-10-22 v0.10.3\n\nFix:\n\n* pack 打包阶段thread-loader创建的子进程中没有经过hack-require导致找不到类似webpack等安装到tua下的模块\n\n### 2019-10-10 v0.10.2\n\nNew feature:\n\n* pages 配置，返回的对象属性新增 entryCode， serverEntryCode , 支持配置一段代码为webpack的入口，可用于项目中动态生成入口文件，简化项目配置\n\n### 2019-09-25 v0.10.1\n\nNew feature:\n\n* 在debug阶段，sever端也支持编译输出到内存中，减少IO，优化编译速度\n\n### 2019-09-15 v0.10.0\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll，原dllChunk值可设置为 dll.chunk\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 全新的命令行\n  * 更加语义化的命令行\n  * 新增全新脚手架\n  * 无效命令检测\n  * 启动执行速度优化\n* 新的配置文件 .tuarc\n  * 约定大于配置，配置大大简化，0配置即可运行\n  * 新增 .tuarc 配置校验\n  * 新增webpack链式扩展，chainClientConf，chainServerConf\n  * 简化配置，合并了serverEntry 和 pageEntries 为 pages，并提供了方便的根据文件夹生成配置的默认方法\n* 新增插件支持\n* 优化输出展示\n  * webpack bar展示进度\n  * 打包成功后，展示可用服务列表\n  * 打包后，集中展示所有错误，便于发现问题\n  * 新增 devServer.localhost 可配置 localhost 映射地址\n  * 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n* 安装包瘦身，安装更快\n* 服务端编译支持 HMR\n* 优化服务端编译速度，忽略node端不需要处理的类型\n\nBug fix:\n\n* 新建项目没有 src 文件夹的问题\n* babel7.0后 treeshaking 修复\n* cache-loader 等缓存位置变化，没有及时清理导致打包不更新\n* 开启 MD5 hash 情况下，动态import css问题修复\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题 \n* 修复 htmlplugin 中变量无法被解析问题，使用文件的 watch 代替 raw-loader\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n### 2019-01-31 v0.9.25\n\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\n\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\n\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\n\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\n\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[chunkhash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.10","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-RxOv1c2uwYxCe5nW+Z2LbzJdnMVhmeKXuXusSX1G6Tzuaro+Pv5u+SvhYKSmartyjdTTI/i2GFAYf64OChxWVQ==","shasum":"d67653a46a1d85efcf12227518c9b61c550ef909","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.10.tgz","fileCount":89,"unpackedSize":577051,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeAfSrCRA9TVsSAnZWagAANiYP/Rpqg3hnW7ecFWlfR0T1\n/BKDsMLpKvUKuwSge0GKBo0mVnJ0VqvtFkeOBEq0bfn21Tio2WASWzHzIPL0\nby4u2l7vMNd97/ZIb7/fwqlG4mypMQyKFZYptTrEYunmX+tuIix6tjwfjvLF\nKTRC3Q4GMAho7AEv+T9t40/752B5a8BJ5cSiOEWIHMvkSlc+V5PxCMBVWYvJ\nXRQ3W7QyKYdZ0WRFR5cJ52ASyBHBNWhvPYbz3ZSnQXdwsUrZVkcp2PPWGvNQ\na8uG1nM6XEdI3yYf2hXHxkZ9P7tXxnIbr+rIIYDNFFyJWJM+DsmkiNOep5ST\nkKiHytf9nL5S+muo/KBNkka0CIJILd+GuhopbGuGHJR8xOFGhPUasg+cqLur\n3UMJtiiAfjx6cZWEXeZCjQlAZmLH0RmhrszWRZetAspHkohQ+gVNyXDB2Ygw\nEgZjIubeTCxcDZK2So7/RwE1IsT2yE41++CaS1u/hxPtsJfW+cy3w7dSK5Bu\nnhs9GrP++xvCqG6oIzgrpSK1mY2Ay54VVlYv0SmxEGHtAqAmN711msEQxRem\nZwfZtukOx2G5TTjm6d6b7jht0q+GXMNtTI0sIrSb14TRyIbW+41Op5wItkqC\nmm57qsTb+5Z2LuQ8nQY7baFqweCvMLDtj7mioS5RJYcSatAN3LT3wX5peNvt\nBODq\r\n=50/a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDcY8PB9PBj9DLlf1KtQvV53dGvr9gnmby6EhAXNnrwnAiAqIGUXEbbgKaJcXb29jQ742CP1C4y2C21n2QwpN89kGQ=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.10_1577186474898_0.2982155274460818"},"_hasShrinkwrap":false},"0.10.11":{"name":"tua","version":"0.10.11","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"fa4b900fbce7d2f4314760d5c835f5ef6b6ac5b1","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.11","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-md+wkzqdtpNxb5iBsLlfKD8igllo3NnY/rozqDIx1rDK2BDEhxDS2QKpnszrbcmMEtDK+SjuJoS99L9wMElK2A==","shasum":"7f67097624f82a9362f86e13eda68aa4c0cb4a91","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.11.tgz","fileCount":88,"unpackedSize":575056,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeOX+tCRA9TVsSAnZWagAAWO4P/1T8Gea7CXYYLHLLleGj\nwucwyEM6U91dm/SKOKHbbFCd5CfZbb4emCjj1p2X907cUG+mB++8bwLWEB3p\nWu61eHRxva5QhU2Vq0h+y2b7ncgN4mqQuTxJWFUP9QPZma7Xns+h5YsjPjRP\nEzcWqWzb920Lc0yymEKC2WNxKe0RCufGjF7hgtFFPrN17JOFEGRCuc4sGxui\nlOFkBIUBn0hqS6P7WUJccf4iVrLKeRvl8uoGhcBxZBqwr4VnxjMv8pIwikaa\njYvwrFkKdZHu7uaCcAYV8uchpiIiJZCwewVsLciIZxj7ysTRb35KnQNxiho5\nWZk2ng8WBVxPAKUgj6T1JtwBMq3Ou5fHRhybDtbyS/kDhkN1RxaI+h4sFdi7\nYeO1adzEIepman8WHj3JsGcuIbTNBG7VaPJ/8XWgDuLqSe/htH0DkqyicU3b\nyDfbLsFMxteZ+pV1yOOxU1xQ5O+1n1+MVo635o4kU7GJobOdNDj48l+SjU6U\nKNoi43HNNVMpyr+1O0tTms7FUAfIbi4XSY8pEoV8XzU6Eo0B8jug3+UOFm2G\n1ItzYJQck/mADzxg8nASRTICs1olLFkb1xcedBVajhy14tRZGrJg6aTK99f9\n5zdXZ164par+zJH88D8yjQSoRJICZQeAtYbEWBVKVjGSNl7Na9GLlP5bTKK3\nJlOH\r\n=Be8R\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCZ5uzMP+Vuz9xs75wB9RwSEsPFGqC8rYaXSF97PLNFTAIhANTAOwU83dU437kLKjh9Fr0YZWdvXqoubm8Xmx80ESgz"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.11_1580826541235_0.6852775416415606"},"_hasShrinkwrap":false},"0.10.12":{"name":"tua","version":"0.10.12","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"75b4d37789b4aac20aaa50036f49c76327f597a2","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.12","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"dist":{"integrity":"sha512-e2v0MLti77Mznsgamrwpcv86nqyWi1diDShdJ8jPtHbqgyvyx8SunoE+1i4R0b31H0X9wxRL16yaxDZoFhGc/w==","shasum":"ec5d1037a9f053cef3168a0aabb303aae6e93e7c","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.12.tgz","fileCount":88,"unpackedSize":575060,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeVPvKCRA9TVsSAnZWagAA7nMP/1KNsTtkqGbFdnadNc/I\nAkMoJv0xzS4A0udeyRz3KboXF/GN5sAuORBYghHhQz6IH0CyBvjUgEFIVPCj\nxA5HsdPHgKyKuHV6JAw38UztOS6qFmGFO1Vyl8geE03fxGTqW/hSM00ROT57\nKUm3g0gUFUIDlh/OJMIHZIREBZuTC7zt+43IOPKaCspkWbs5x9wIsvwEAveJ\nDtkNrRnP8UG1r/mttqJwNd3rX+ABR27pYVNFPm2AD6cqEKtZTw8Nr3e/Hx+c\nTFzk5WZ+MvZR0+3VY9qz4ZaxISEo2Rjft9xr41guncpMWi7l+avYsylWnw1N\nC5dpZK5ZV+WVrIMbjt3YwKAVbnlEvd+Wxpad+cYl6Y5x5h6i32ycdquNWjWL\nINjR5Wlmhrgaad1VZdlhBxxtEmidNn/88aRebQSsQIcYjovABrWRRuoeS318\nPVMDfJoIT9qqt3zKAFNCYVaEvKpe2SOP+4yPQWD2pc+aMgbx2lZjyYKg2DGu\nwdM7kgL1z8uRcw4bppc62Nss1YW4IMbOyVhD8pu+qjN6uKbRDSGAtsW9TlPV\nRoGeP08LLpScASJyU89dWW5Ua6w//eG36uY1aBxCbdBrNNRn9+KdcvxaUGot\n+ZI9fdkR4f+GRguwmJvDRq4YiFS11AcLB64srgEgbtIxLZ7r4U9QMvb1VNMJ\n7g9O\r\n=OB4k\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDjzsaJnr3JLShIeczlw/H5FQDgjLGePYcD1GRdCcopegIgW7th50kWYyHECDHYsMx3mtTTFUaFgCF0qUE0Ty3En5o="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.12_1582627786170_0.7938799906807064"},"_hasShrinkwrap":false},"0.10.13":{"name":"tua","version":"0.10.13","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"781df0164f969ef1cb76157e4585aa97026f1cb6","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.13","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-n4exMF28BBEKkS2WYFoZ7HaL7scYsXpoizt5L4UoaXSTazQhOPM/5T+tAlQT6fx6tX1jStvLjMnPi1u5wRzNww==","shasum":"b77a22be55aac1b3d68e82c4a7dfe7142352cede","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.13.tgz","fileCount":88,"unpackedSize":575202,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJek8eXCRA9TVsSAnZWagAAsEAP/1eavxuj+XGfZT+xbiOR\nbOEwTS2HW0zF6bpiTr+wNZBs6fFW0Xm20R8xdDIkWmU+Kso3662xKZaa9BF1\nJSzi7FeBoSvex0/EdNwGnjdTVFM6T2seSTXLzIeNZyhTC/O0GEGlGFbBD6qo\nfTzk54JMWvpBqh8XB1G3BpkSSHt2+ALl0gslRfeYwQCG+oK0YfZdETHAgapZ\nbRLyVQKRP8w+tO+seMNrds4VsYFLyEWuH3ZB3GcyHaOAxLRtGRTDuQ3AkYQk\nER4e7xCOvZynWjpOKm+Yl8nntubgP4ei6SHn1zVg5Qgn5zZ82mqc0Ou3Gn1q\nxqhsoKcrZl8oV6uvs9ZxJaI35ozqYRYIJ0xwJKvy/OijfFmXed7DVGKvd0Vx\ngGfsoiVCLayTuPw4LzvXlyNDTdD/Rv56FbmQkYSCHJOqC0qKWoRYiy5O/FFW\nVgCdM58VyBu3qXeNr2Bpm+gCbb9B4Ns5QzgotLC4gIVmKY+47+IxcAHk7l0c\n13cffoYoDjFQFFKdLK/PiNsGp/7mK83NqNWqXzXcM5rmlJcosoq+uKksduWc\nTeIA1TInnD2j337Nfc61C5gq1fmc7dQ5fxiwgkp18DphZIsRBffDvq8Mj/Mf\njVnJ4NGdvyBzBwvpKPoB10RWpVRtPK+V9pQo4KPJMLhVYntO2Jtd3NSzSCwl\nUq8b\r\n=wU2s\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEfXgrTiiKmK9br2uOWGj/B5oJL0o8vo3xITv7S/tIvsAiEAj4ouJm6zpVM0g8ErT9MmogZsr6OaWqD0T+1gndo9kzk="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.13_1586743190930_0.08292174108077432"},"_hasShrinkwrap":false},"0.10.14":{"name":"tua","version":"0.10.14","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hard-source-webpack-plugin":"^0.13.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"c84f716d823fbf868c69663e16fac58cca718265","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.14","_nodeVersion":"13.12.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-12Nm4CqS1T2oDRjwIVkQPgjz2+vx6Kz+ilnwmhmqZ6S++diLHZiZCUS73RoOR4oKtUC/zCTfST1OaCNp/vb8jw==","shasum":"7a2537e45495a1f3e2c7aa0e788374aea66152d7","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.14.tgz","fileCount":89,"unpackedSize":577733,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJelWXbCRA9TVsSAnZWagAAffEP/jUpdrkDQC5ThbSmk1D3\n0ZgqI94xdI0JaLl+E4DyyMBs9bFPuiKg24v7RTC7bqPHax8k5vUoo+xTf92W\nztxj6Jm4VL9huhiISRf0jxR2fgeUeXiSuBrLVLYPTggkKIlUE+Y+ZhhuhqeA\nOZ3FVDh9BI+XCMtoHkTKsctYaVHtrnooxXIiGkmo/znn1q7dpiU+ke+f4LzK\n5ZmjoqUHqg0VNfer4HKkXk2vluTGQJFQGhPMZMSngMwRxJNYd3sdrYvuXtzE\nDNPMvLY743QmJiSwxFcQDJvPlq8ALdBmRhhwRKQ+BH+ujZTkjgPkl9L7jPSg\n4AXmtcAw40YoAcdadZM4uwX7qKPIuMp+ejwD8QpBDjdRzdvWm+fheC+F99VB\nxEEeuWGyRE6yg+VdI4UzunEEzXc2uyoQeGB4P9Qt87mE/FPVulToGY3jUNig\nXaRWU4mezdJ1FhHNJcfynNr2lmXj0ZvFZ23gKo1kEPlFUr9YilLwVQu2eGoM\n0+h//wwVhQKOF+WRk4rQQ6+EYGkcu3EJn02gQF2s99XiAjC/Q+Tx7kuRZ1E2\n5TJAgMBgVx8JwRMY07m3JgGFWhP/lTlE0mn2TwQlTD2vkA1Trf54I4D1Kue6\nJyo4C4BonwypJOVage1pQSUYiBXDW40mfxwZbCkZcakuVJBs/dErMAcr6PLt\nSBKH\r\n=JuHX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBqn06McyCkbLHOPFGEBe8620p3I4xgR7Km4+2bjsVc7AiA45VrNcIxiI+QceK9G1k4QuPSxfWyFQWUdWQ9oGZWiuQ=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.14_1586849242906_0.12769717838615047"},"_hasShrinkwrap":false},"0.10.15":{"name":"tua","version":"0.10.15","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hard-source-webpack-plugin":"^0.13.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"97e3c7ae019fbbb3ad3ccecc3ffd8322b3f2ed39","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.15","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-bJ3Be1pEYkrCxWBXg9BQ8RMPCiwPSmKQZbOemHshfPcwLcnU7VvJK1uD1VRpzPkCJpnUd4P0kcqEFd9xy0kttQ==","shasum":"6bed780dcb3ff220ec4f8178a3a7d32fad108bc4","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.15.tgz","fileCount":89,"unpackedSize":577792,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeq8rqCRA9TVsSAnZWagAAETgP/06AjB92BhhBiRTyDGTc\n93xF5FqCILjOhrBAWOWJDXvqFhQOx43ouRl80zNgmKHP+Wg0KKZWi3su6mBI\n2/RHL7Xm4NiBcBD6SNYWdNG8TmXpqTd3m0jJ4IT/MF3/ppsQ76t8j0kBViHx\ntnM3KZcPDmJ45WSOD1wiXLhLfAKGX+0k/WcWOg4NCijcyE6ICmQ/ucGzWTnK\n1y4t3rQsTjdXJglrMhraUP6pqZvE+M/KakHwzIjapEIEQN5iFtpZ0eueYYjA\nIuxWA/trqtJ/a4q6fwj89FdmsKpKIsXetAAEekCxPcHb8jiC1rXtoYfiPqOV\ndpEJZCSUxB8AOqU5UhZMNAjgz8+eP47afmhpXPQZQZQiFDuLXpPh48p6+stF\nJg9KJLcHhiUlm8tNZXn8fOcln4xELhqjkUCpXjCavOrK2Lsr1nBzQVmIFyD4\nAeDgNkEQCnwekaWpSozDu+lD/YLh76sO/i9djbvt00EUznMjIckYHuMRCGzC\ninB5CH11jkqkkuofoo4BGCzFhwOvnb9vLCsLCBHPade3X233dImXMEQluIpK\nbezrLISxqUtF4EnAjqBR5RYi6CJvTT919gc8WuEga+3S7o3gFzUS0zMPl0SF\nQ7Z/Fsoh7cH1t6wa1Jh7Qzx2Bw5l/PVKu8gZyEtHVCWC+LE9t9Xoi9ICCo1M\nHa+5\r\n=vE3c\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDjQp8oVTHfWo25R0uMtnFA9MKLw5sEWihOs+xhzc8LHAiEAi2/Msz4D6cUGivJmzZo/JtjNZXN/Qco/GFyYStU3qbQ="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.15_1588316905796_0.11436308974474896"},"_hasShrinkwrap":false},"0.10.16":{"name":"tua","version":"0.10.16","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hard-source-webpack-plugin":"^0.13.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"7d08e0f3454b3c2318a4d2f4cece0ff653576749","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.16","_nodeVersion":"13.12.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-pBPRhgKqarWdFoRZw6od96FcgArQSqMoKzmlEoji3ygzQ4VDzlsifLztZjoPn0itdASHjLO+HrcjN6KqucmTDA==","shasum":"213f6be4f7c58df77aecdb4f3741f71f126ab71a","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.16.tgz","fileCount":89,"unpackedSize":607560,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJer4xyCRA9TVsSAnZWagAAZ4kP/0Ik8TaHYg7L+aIyCsi4\nO4HGhQ2zIjIhc0HklGPCdhDyGjeXH3b3LdoIopcc763K3dLbMy0qrW/G1RP+\nX0gbLaLUJdtMPkDlyl7EGjIWYeBb5NcgS9vLEYeC2vSoNMj89IjXnpUxNHpu\n4zcZM6bFZk1Wc6xjv5/se6I6eAkLGJ7rvolBUmgzWrqosy7ICXOdItYag1JF\nWQh95HFkbJMl5zkuNf+qnLBWQBbvXO4qIFuf82Dn4zDH27RRJDIkBDpiYzC7\nzaA9SIX0PQiuNV5NJnewWOkGXK2mee0NxWmoL+bcEvyVQQ5ABYXvaQiU8Ujn\nUz0xjET1MqWUDll0bniISV/2Um9GuEDF12LIsuueKzrqkXUkHdbd4TDQtgsW\nvA4g9lQXHwW/xiftKvyb7KlNG8uKEV5qIs2a+DXioqsKRdznobHQb4rfeUTq\nrEQ1TPb81FFzw2UlDGkZKeWFaqomuR+AwboY+4SHg+7Zj+M65WJjUpnWhVpC\nKACD73GYjW+mO5hC0PVXCFVXUEde5nLMed7yPnJs9BgSTTx4Bsh+PnEFpyRL\nCl8KPtoBmqPo9yFxgem2YUvBOQTmCY2yyWjB8uJ5bAYX4f6csufM/aWy5Hdp\nsoXH1pSw9/9IrC3HfP4KQfSXuBvGlflytFlagAjpnG2HGTZP1wYwD6IxF0Cg\nybbs\r\n=qNWR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBNODErd1VVAmY3CtNoOdU4ojYDGvHLX8+rcOJl7X/nrAiAcb0oD3ZIda5zgObu4YHSFhi0kn+Abb/Jk+t07GwoNzg=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.16_1588563057961_0.5091785944613532"},"_hasShrinkwrap":false},"0.10.17":{"name":"tua","version":"0.10.17","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hard-source-webpack-plugin":"^0.13.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"30db8d2746d98a51bfa7960f24f12ce1e43b4d2a","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.17","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-rS/xNnwgqWAztiiwuvICczKatQ1+rph6c0ARYUHdDMXlWjgIg/Pj0duHD/0knVKgvt35doExuz7ICVQl3L9mlQ==","shasum":"70a8ca94e47915005fcaacb6d696bf75833fb012","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.17.tgz","fileCount":89,"unpackedSize":607709,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe9H1VCRA9TVsSAnZWagAAeUcP/09ccc4aJoKe6O6+ryML\n8eiJzioUh7B+oV2zGAD250WvQqScIuiLGDE1ajlqv83Pxckxy2n/Rmw3sSeI\nk5OmsEQTkCNsiFvuz4IR7K7lp511dQ3PTZR13Vum4Be95Ra1ub6dlzPsjl+n\nOfzmJUeSK+j7cN5B9w2k0PkDQ6iCSyt0g2INto0+j6cG/cZZqJXJ3mReB1u4\nBRbqZu+ol6v9Q35em1+KiD6Raxj9GoFjNSzt0bFt19E/N+sbNrJ+81pakpEV\nQSL7qr4YSb3tk/PEZ3r2LZ/QSWk1BnzM1ha00a6eAWqmrgGpOM/cZtKa2su+\nzMqFLtJwyLx8Dz7qEOvoqnWex+zo5t/gAHPD8wkO3qHRN5MrGHeKvJlSlRQ/\n6HiOqC7zMJT6N1inhW24DWhCElnrSUbyNh6mtdVXJj09M7wPd0QmFh5NuAhW\nGBli4CddPspvEI8nkQpM+0PZx0UZg+TWsLrX/844MKavv3V+JALxEfMPtQCj\nsgxviewg/rO3+y5LAFHDSMVovSZ/7yl8ZGEVEhXkmpR9d52NFJLE+aY/TCq4\n6+Y5z7KOhAmsssbm3Qb2xVfSYv2rV8XvGngdkqvIFIQDVKZG0OKPhqL1H4M3\ns+87MS6Hxn1dgdEsLslKACbXWqXN42CX8xfgsVeJxIPy1d3a03ssQ/U6S1+y\nEh6x\r\n=8Wqs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFF1vNRaEJh3H5aseN2PcZABgeVJjT8TAlQIquGDBtrVAiBHoXp8uTgYa3dq+a1kLWx2bU3lZEpD7rIt0hAmj3QykQ=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.17_1593081172948_0.9561508975861142"},"_hasShrinkwrap":false},"0.10.18":{"name":"tua","version":"0.10.18","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.5","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hard-source-webpack-plugin":"^0.13.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"b60fceb05798ef9a4dea20bc05dc353dc0de4853","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.18","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-BfAntwxgsQTNxZJQXltbcDxJJYEhj3hWZxmxXN0oG+YL1yj+4/wwD2We1YHrzwPPlVhgTuC+m1gLMDdEYaa4Gg==","shasum":"4f0c8f0e67127392a11d49bba75d67a5116c88cf","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.18.tgz","fileCount":89,"unpackedSize":607794,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfDsPBCRA9TVsSAnZWagAA2RUP/Rsr6XWyQLbPrLAIik2D\nQ7DbMHWxJ+oniuqlV9TvDKMk9734KhU0XHFbPXEQ4gVuP19d6YW/1nabNJjZ\n9Z/0Ko8KpdJ3LGcAr2B4OlbTvcOdjjDEQbn1atqxBJRMxqX3dprI3REvJzmm\niq5JucXryTjzXT6I336Eahn7fjQJOsacOtXzy92X8SpYjc4xHF8mY4UlWnX+\nHjwp+5oAnjFa96W9iKe+E/PIWwYrQIJ4jrYOu1u2rQiPvi6S+u7smGEupu6h\nu3zsCFYeu0dwAmKnRs2koJ+jE7MuBkA04/qMKWgOeba5vFykazp05zdgMT6g\n9vao7uHUU7H7f4P+yZar89TAUFCOsd0/EhFwjLuPMaZtt9rN+sBhL7fApYc+\nqt625AsJb4mwlT6m6FdaO3ffXggQNwmxzAPW8olUlh9eWVgmf5TpYgATajUO\nPzQ4Yfx0kiw3GhBKBB12G/v+ITjYBHsJEqJEz3pi/gJpDyvDej6cG3cSXpJY\nk+WjNUZMRcQeyRbNFN+y2Of71cK+3lZz2j70yYvFNcBBl2wfPSrvN2qflbKe\nPjrLPh6j/Z3Tzoo6Co4XBb2UadW+e6we4iou+4LlE4Hwbm/iCYkrlc2erGgE\nd/qGLwIwI8tmxJOmlAkbu5xvAjUW8WKSe5RgfPrHt4+0SSkFnj6AyiYYtdxg\ns+95\r\n=hKgR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEPRJnsu/wMhdbFndYXSGWmLYLYh8zpMnPwzGu4Atp6YAiEAjQb0j7bazjtwHmcXRumT4kdNhAW1Le6T9fcBzBwoxzI="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.18_1594803136657_0.4223438773780026"},"_hasShrinkwrap":false},"0.10.19":{"name":"tua","version":"0.10.19","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.9","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hard-source-webpack-plugin":"^0.13.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"96256d950886b1e815641549b954904196989019","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.19","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"dist":{"integrity":"sha512-5h9SDSF+gPzlR2YXIyBIA2stfH5GhDsnO8/mi0PBL8ca3g0lcmpqL02GllqnxaLKuRGEFHzrKZB+JSLkCWBacQ==","shasum":"a1078839f983e38df7f7c2672b385089854f06be","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.19.tgz","fileCount":89,"unpackedSize":607794,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfEThWCRA9TVsSAnZWagAA/gYP/3nR5v06+wgYyTrUlGIT\nIGTDFS47+Nc04hz8Up5afUZ3ZdvP7ZXhoPedi/kyUV+HJrGtHkwgH6Pz3+sI\nW51xc9Z3jFmSBLEnWO6oqd0V5hPngvb96w5ZVST6iQ7d+H9QqBWLkk9MwfGX\nbwP/VfE7UPiq6CkBWuDSlyeK0PmVgrc36JlYPa3BYjtk4kCNWGfHpqyZnvOJ\nyWwMiyMXOz/UusUZdL6yLhh2vpE3M4Ve0GIggn/J6aGKblEagZUb1VeaAxfk\nQIFkRisyyJen6167DF1psen7oADIcwhml0bqMxGTCm1IrcPb+XPeV2iA69ro\nkbvkFkA4Ug1CGTUFNxmvz9QAYw3N1yrve0+DOw/u1/Pk9GZTDY5YIAT1tf8T\nW+lmSbMaAIozJQCFzJHrQm0nK9TrcXA3COyyYLC0976IKjBRJ/4WKsK+hMc+\naCJ9JAReMc5ahtJXHhwcVYitFxNiq9n4BVCzRgZ/FJp2ApxaA1DaMmib8/V8\ns/DzF4CyMwY+FPvVAPza5FnUHEYiGtJRHbUU9tfOPSm81N9Njtay2+on/vDu\nZsM/MhesfQNS+7kvI1y5bAde3CLbqca4JwxaQlSHMgdrWVPXl3232tmC3UhZ\nTz4tdznlTTwn4zjCVswHGNELMgKTF7NZ59Cv4xZhafP8FAyZ6TgnDbaQtV6S\nJLmk\r\n=Jtub\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG+3vsAjTBwOWvS6zbaEd9ArGW7GHnVPNS8pGf2+ax70AiAuIYi0spNIDjRXljWNd/vb8F7H6E8/AnfqJDCM0m8Gaw=="}]},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.19_1594964053437_0.12642035574031318"},"_hasShrinkwrap":false},"0.10.20":{"name":"tua","version":"0.10.20","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"./bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.9","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^6.0.4","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^5.0.1","css-minimizer-webpack-plugin":"^1.1.5","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^6.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-inline-source-plugin":"0.0.10","html-webpack-plugin":"^5.0.0-alpha.14","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^1.3.1","opn":"^6.0.0","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.19","source-map-url":"^0.4.0","style-loader":"^2.0.0","terser-webpack-plugin":"^5.0.3","thread-loader":"^2.1.3","url-loader":"^4.1.1","webpack":"^5.3.1","webpack-chain":"^6.5.1","webpack-dev-server":"^3.11.0","webpack-log":"^2.0.0","webpack-merge":"^5.4.0","webpackbar":"^5.0.0-3","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","@tencent/eslint-config-tencent":"^0.7.1","@types/jest":"^26.0.8","eslint":"^7.6.0","lerna":"^3.22.1","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"0ee54994ae6d92893e03c57e7ba398e3df4edf4b","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.20","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-SGS1Idoq8E6KjDzFQcQjqithfBxVIT4zMh0j7W9Ho2o+kv2JQlEwiGbQHOk0Wb2Zl0+o6cnVzH6QuTWkIH7X8A==","shasum":"ffef2c6c13073c644cdf1d800f0e8eec16a5e8e4","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.20.tgz","fileCount":91,"unpackedSize":605557,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfu2/rCRA9TVsSAnZWagAAqyoP/RAzDyZRxVzJJoILTx77\nVO+tO8jxa99zU0TdcSpJrzIHYJGEP41g+xSPcSxtsqxpYnex8AC4sU1uQ0Gk\nE+hp+y3C0F1YwndHmcJHqh+vRu5N7eVb6EC5Md3DZ5HUwuIdSvUzUVNYfIJB\nHJxKET33sqtJv7uxnrV6B1WDkUKfu0qCkReXp48uNPlPJ9qVKTexbVIuvJkx\nR/u8XjISxSelXUix4mjIcX/DC78PmrrOOfwpRqoK/LTYnXPWclaZnalNHzJC\nR8RsezYRCVfYSUCKecfk1zke92xrIcB9hRCnh3w1A7Q/mMxNoGEZq4JtETNT\ndoLcgv/nOqTpY7E7S6wnpF3kiAiCx5o78R3WOlS4fC2xkUUgU/2+Qu8vCbVn\nShnu8WMjXleptN4irn+4FyZ9ria8O7SMVtD0U4S+GHwAP4ZTtQJRwljdHiof\nxO1VLttH1qHXN+S+nVcRjstBPVfzQRjzwHcbiCEe0WTa3TT388zUkeykTIpF\n6H8PBSnWnKsGEU+MzBpWJkqBWIokJ/cJn0odOdZ9nruaDl8dlR9FMW00K45b\nl9lv7JF4FQzwcJQ2gOYv2mJdwuR6R8tAXwTLYJ70CJojrZjMQcm3AtX1gdzq\nmIhJlQzyGHZPvwBXZg6xLtJnhUIdDfD56WItbtexTCASsPi0yxWbfIsXfU0J\ncu0r\r\n=lMth\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDOAGfEJI+AdZJatfvEehN/WlNqe65Ju09M/NgaRT9HlAIhAKWmPPJLLTdRi2BHPkYa1fmNZrHYzW0bc/OpLMtKCkZk"}]},"_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.20_1606119403372_0.34665553675593097"},"_hasShrinkwrap":false},"0.10.21-beta.0":{"name":"tua","version":"0.10.21-beta.0","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","pre:beta":"standard-version --prerelease beta","pre:alpha":"standard-version --prerelease alpha","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS"}},"commitlint":{"extends":["@commitlint/config-conventional"]},"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.9","@tuax/plugin-babel":"^1.0.9","@tuax/webpack-chain":"^0.0.1","ansi-colors":"^4.1.1","assets-webpack-plugin":"^6.0.4","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^5.0.1","css-minimizer-webpack-plugin":"^1.1.5","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^6.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-inline-source-plugin":"0.0.10","html-webpack-plugin":"^5.0.0-alpha.14","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^1.3.1","opn":"^6.0.0","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.19","source-map-url":"^0.4.0","style-loader":"^2.0.0","terser-webpack-plugin":"^5.0.3","thread-loader":"^2.1.3","url-loader":"^4.1.1","webpack":"^5.3.1","webpack-dev-server":"^3.11.0","webpack-log":"^2.0.0","webpack-merge":"^5.4.0","webpackbar":"^5.0.0-3","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","@commitlint/cli":"^11.0.0","@commitlint/config-conventional":"^11.0.0","@tencent/eslint-config-tencent":"^0.7.1","@types/jest":"^26.0.8","eslint":"^7.6.0","husky":"^4.3.0","lerna":"^3.22.1","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","standard-version":"^9.0.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"bc2b6f5fd2a3a4afc29db36014071b506b22b2a8","readme":"# tua\n\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n\n1. 通过 npm 或 yarn 安装tua\n\n```shell\nnpm i -g tua\nyarn global add tua\n```\n\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n\n2. 在项目根目录下执行初始化命令\n\n```shell\ntua new\n```\n\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n\n3. 开始调试\n\n```shell\ntua start\n```\n\n启动服务器。\n\n4. 打开页面\n\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntries** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntries: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntries**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntries 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n\n打包发布项目\n\n##### 5.3.1. stat\n\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n\n##### 5.3.2. params\n\n参数，可用于过滤入口\n\n##### 5.3.3. suc\n\n成功回调\n\n##### 5.3.4. fail\n\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-10-22 v0.10.4\n\nFix:\n\n* 修复只有非服务端渲染页面的情况下，没有提示url地址的bug\n\n### 2019-10-22 v0.10.3\n\nFix:\n\n* pack 打包阶段thread-loader创建的子进程中没有经过hack-require导致找不到类似webpack等安装到tua下的模块\n\n### 2019-10-10 v0.10.2\n\nNew feature:\n\n* pages 配置，返回的对象属性新增 entryCode， serverEntryCode , 支持配置一段代码为webpack的入口，可用于项目中动态生成入口文件，简化项目配置\n\n### 2019-09-25 v0.10.1\n\nNew feature:\n\n* 在debug阶段，sever端也支持编译输出到内存中，减少IO，优化编译速度\n\n### 2019-09-15 v0.10.0\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll，原dllChunk值可设置为 dll.chunk\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 全新的命令行\n  * 更加语义化的命令行\n  * 新增全新脚手架\n  * 无效命令检测\n  * 启动执行速度优化\n* 新的配置文件 .tuarc\n  * 约定大于配置，配置大大简化，0配置即可运行\n  * 新增 .tuarc 配置校验\n  * 新增webpack链式扩展，chainClientConf，chainServerConf\n  * 简化配置，合并了serverEntry 和 pageEntries 为 pages，并提供了方便的根据文件夹生成配置的默认方法\n* 新增插件支持\n* 优化输出展示\n  * webpack bar展示进度\n  * 打包成功后，展示可用服务列表\n  * 打包后，集中展示所有错误，便于发现问题\n  * 新增 devServer.localhost 可配置 localhost 映射地址\n  * 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n* 安装包瘦身，安装更快\n* 服务端编译支持 HMR\n* 优化服务端编译速度，忽略node端不需要处理的类型\n\nBug fix:\n\n* 新建项目没有 src 文件夹的问题\n* babel7.0后 treeshaking 修复\n* cache-loader 等缓存位置变化，没有及时清理导致打包不更新\n* 开启 MD5 hash 情况下，动态import css问题修复\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题 \n* 修复 htmlplugin 中变量无法被解析问题，使用文件的 watch 代替 raw-loader\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n### 2019-01-31 v0.9.25\n\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\n\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\n\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\n\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\n\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[contenthash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.21-beta.0","_nodeVersion":"10.23.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-8lCe1tvAAEYucp2bSI8Q7QpblXKq0SxyCL/Wy5puCR48dyPodECVMJNvkhQ0MUD/ufmG7sM7fYAgSWJzsLV6dg==","shasum":"47e157242d520260d77c431cffc1f9f960312ee5","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.21-beta.0.tgz","fileCount":38,"unpackedSize":491664,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfvGhxCRA9TVsSAnZWagAA0q0P/0FLe/W4qnR+NysD6McO\nfXwPKr2cVDm3t561jMzIBlU8WtUYof0V0ZnewxQmAZ53zdmOeBnqtp6EJ43n\nTWT5BRXClETuFxng1sUhCxzAWMD/fRaGK7bIrziwwgxFKnxLwknMe8rsTQ2O\nBZUTeU3AAPmTkOUyCQZ3YSgs0UZ6jsfcfZBCd9OKqJxmMTqSqrZXnfwuon1j\n4Oewv3wvv9wavLQwQsiPBcrcpz/QaC+dbsXidkGt04kfcWlb8gckPzPicPEl\njDz3/HFDfVeCPsO7E9DGna8TOSS02m4KrOw4MQtUuQkHIQTP0QArNVU8K3Rg\n1tutz7BPx02ZnfCHdL8CgWVx0hCUz0ax/8ujU78H0oDHCvswi/6cojmVdrLP\nBf31agpsCrhrxvACjoHrBwCVZjZS+REzl0i7r06PH5IfpdoHOfYA6TV0cpR3\nGT3NNBMQQD4boOBiMDCBeqfPxH+kvw8q7xfrPXKJ/ke0ntS7lc0UNgey+iZj\nRX7sXO7INj5NbRYm76zT1FDiS7QR70jzh4aAR0qVMsCgVB7gcEoR+BH1M0PP\n8xITEx2KvttbqDLl9yuwDYiuSNJA40+/k20DWMbcidaNY+XumDO/7h2CYdST\nURPGhkwEV0LfhRaQcl+UEkHvsrin38gY2cN5vcZh1jl0oPvFjP4Jhv2Qmwc5\ncjs1\r\n=kN0+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD44i9xFHWJpOoi/LUWaPrg9jGvY+lOH0jkrt29twTqwgIhAKGIzTbuuJ7tFwHrgTiud5H+JA1b2M2rMFgYuWBYYRlV"}]},"_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.21-beta.0_1606183025108_0.47964741105210607"},"_hasShrinkwrap":false},"0.10.21-beta.1":{"name":"tua","version":"0.10.21-beta.1","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","pre:beta":"standard-version --prerelease beta","pre:alpha":"standard-version --prerelease alpha","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS"}},"commitlint":{"extends":["@commitlint/config-conventional"]},"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.9","@tuax/plugin-babel":"^1.0.9","@tuax/webpack-chain":"^0.0.1","ansi-colors":"^4.1.1","assets-webpack-plugin":"^6.0.4","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^5.0.1","css-minimizer-webpack-plugin":"^1.1.5","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^6.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-inline-source-plugin":"0.0.10","html-webpack-plugin":"^5.0.0-alpha.14","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^1.3.1","opn":"^6.0.0","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.19","source-map-url":"^0.4.0","style-loader":"^2.0.0","terser-webpack-plugin":"^5.0.3","thread-loader":"^2.1.3","url-loader":"^4.1.1","webpack":"^5.3.1","webpack-dev-server":"^3.11.0","webpack-log":"^2.0.0","webpack-merge":"^5.4.0","webpackbar":"^5.0.0-3","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","@commitlint/cli":"^11.0.0","@commitlint/config-conventional":"^11.0.0","@tencent/eslint-config-tencent":"^0.7.1","@types/jest":"^26.0.8","eslint":"^7.6.0","husky":"^4.3.0","lerna":"^3.22.1","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","standard-version":"^9.0.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"a348ff34ddf767b2a3fd875b54f5e8f6f3f11822","readme":"# tua\n\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n\n1. 通过 npm 或 yarn 安装tua\n\n```shell\nnpm i -g tua\nyarn global add tua\n```\n\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n\n2. 在项目根目录下执行初始化命令\n\n```shell\ntua new\n```\n\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n\n3. 开始调试\n\n```shell\ntua start\n```\n\n启动服务器。\n\n4. 打开页面\n\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntries** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntries: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntries**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntries 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n\n打包发布项目\n\n##### 5.3.1. stat\n\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n\n##### 5.3.2. params\n\n参数，可用于过滤入口\n\n##### 5.3.3. suc\n\n成功回调\n\n##### 5.3.4. fail\n\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-10-22 v0.10.4\n\nFix:\n\n* 修复只有非服务端渲染页面的情况下，没有提示url地址的bug\n\n### 2019-10-22 v0.10.3\n\nFix:\n\n* pack 打包阶段thread-loader创建的子进程中没有经过hack-require导致找不到类似webpack等安装到tua下的模块\n\n### 2019-10-10 v0.10.2\n\nNew feature:\n\n* pages 配置，返回的对象属性新增 entryCode， serverEntryCode , 支持配置一段代码为webpack的入口，可用于项目中动态生成入口文件，简化项目配置\n\n### 2019-09-25 v0.10.1\n\nNew feature:\n\n* 在debug阶段，sever端也支持编译输出到内存中，减少IO，优化编译速度\n\n### 2019-09-15 v0.10.0\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll，原dllChunk值可设置为 dll.chunk\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 全新的命令行\n  * 更加语义化的命令行\n  * 新增全新脚手架\n  * 无效命令检测\n  * 启动执行速度优化\n* 新的配置文件 .tuarc\n  * 约定大于配置，配置大大简化，0配置即可运行\n  * 新增 .tuarc 配置校验\n  * 新增webpack链式扩展，chainClientConf，chainServerConf\n  * 简化配置，合并了serverEntry 和 pageEntries 为 pages，并提供了方便的根据文件夹生成配置的默认方法\n* 新增插件支持\n* 优化输出展示\n  * webpack bar展示进度\n  * 打包成功后，展示可用服务列表\n  * 打包后，集中展示所有错误，便于发现问题\n  * 新增 devServer.localhost 可配置 localhost 映射地址\n  * 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n* 安装包瘦身，安装更快\n* 服务端编译支持 HMR\n* 优化服务端编译速度，忽略node端不需要处理的类型\n\nBug fix:\n\n* 新建项目没有 src 文件夹的问题\n* babel7.0后 treeshaking 修复\n* cache-loader 等缓存位置变化，没有及时清理导致打包不更新\n* 开启 MD5 hash 情况下，动态import css问题修复\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题 \n* 修复 htmlplugin 中变量无法被解析问题，使用文件的 watch 代替 raw-loader\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n### 2019-01-31 v0.9.25\n\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\n\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\n\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\n\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\n\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[contenthash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.21-beta.1","_nodeVersion":"10.23.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-si+wYUBMz5lwtzQyToRxKImCiDqNIL+4HZ3TYxRsnP/le/LLF5yg09AaeDYE9wnEAPTH5il8/Dw84gR0KYxD2w==","shasum":"d64d892ad972eb2f90e9e46b357d4fe7c6337c7b","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.21-beta.1.tgz","fileCount":92,"unpackedSize":608024,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfvGoMCRA9TVsSAnZWagAAyRwP/02+ulX//XqAJhFLijqH\nyGakKslCWb43DvWzwNtA9CfurRD1eJm2lVx+7lyxGbl4sPM2myoCd1gAM1e6\nSfAGNBbR+dxvpzuXj2N81Zi+2+Oc7aTNPW46fbUIBDSQCiKiNqi/EFb+U6QA\nJbSUCXks6neF3iSVsMwPkhPKpx6zJbepwRyK811+sfTEmCtZMPKMw4XG0YhZ\nLEfMzTU0yueoMpmUsTd+djXWkpLE+oivAHtiLgK1AD6AlIYUMtL+CHz7y54Q\nChXRE2ovxY9FykZkM9/SnhxJ75xH+dEWp1wPtALIfAu1f9sDYMoAfrJH4ooX\nU9GXsW+OPGlHEJ8yGI+SeZKMK1fxGcENLg8svSkK8JWsp1M9WprHkat2VJiq\ngmwPEUCcPpzxwA2JgY/jDc4A07C5sofdzO2NN5CFjfLdP0OJr/ps9s/uSRin\npJVQFBeFp1/JLTiEsjc1srlSwOe3inqqCuJCOPXd3QxK0LeNePCFp1Wp6ghV\nY+b1otnQBw7lH7oJD9PEWaLuAfMb4+IPo7e4g7weKxi8mSjrCQFZtfOYYwdR\nUHl4+Z6YpUqDenxJJq7/q8m3DorMPMt2G2m2LdnytbOXhQVI0WN3cgB/sUF7\nZBxpAWte7NhmsjnXugS2eFOXPn9MxJ98u+R3H3y3QYesoAkcJU40eNG9kNlx\n/0rW\r\n=k0ZB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDHyQ0CgfdEZQ2KFfizkOWB91NWPc+zmujDKy/lR9MrJwIhAKBkY6mGjUMLGWOS/f+lx/hw7Y7pbnoE47WyDUbUj6Z5"}]},"_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.21-beta.1_1606183435827_0.5811340426482188"},"_hasShrinkwrap":false},"0.10.21-beta.2":{"name":"tua","version":"0.10.21-beta.2","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","pre:beta":"standard-version --prerelease beta","pre:alpha":"standard-version --prerelease alpha","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS"}},"commitlint":{"extends":["@commitlint/config-conventional"]},"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.9","@tuax/plugin-babel":"^1.0.9","@tuax/webpack-chain":"^0.0.1","ansi-colors":"^4.1.1","assets-webpack-plugin":"^6.0.4","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^5.0.1","css-minimizer-webpack-plugin":"^1.1.5","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^6.2.0","fs-extra":"^8.1.0","hostile":"^1.3.2","html-webpack-inline-source-plugin":"0.0.10","html-webpack-plugin":"^5.0.0-alpha.14","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^1.3.1","opn":"^6.0.0","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.19","source-map-url":"^0.4.0","style-loader":"^2.0.0","terser-webpack-plugin":"^5.0.3","thread-loader":"^2.1.3","url-loader":"^4.1.1","webpack":"^5.3.1","webpack-dev-server":"^3.11.0","webpack-log":"^2.0.0","webpack-merge":"^5.4.0","webpackbar":"^5.0.0-3","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","@commitlint/cli":"^11.0.0","@commitlint/config-conventional":"^11.0.0","@tencent/eslint-config-tencent":"^0.7.1","@types/jest":"^26.0.8","eslint":"^7.6.0","husky":"^4.3.0","lerna":"^3.22.1","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","standard-version":"^9.0.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"8efe89151afa8ea533192295c689fe6e1bb5206c","readme":"# tua\n\ntua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持。\n它封装了webpack的复杂度，集成了webpack使用的最佳实践。\n让开发者更加关注业务，而非复杂的配置和工具选择。\n\n## 1. 快速开始\n\n1. 通过 npm 或 yarn 安装tua\n\n```shell\nnpm i -g tua\nyarn global add tua\n```\n\n注意，使用 yarn，需要配置环境变量。否则，全局命令不生效。\n\n2. 在项目根目录下执行初始化命令\n\n```shell\ntua new\n```\n\n此命令会在项目根目录下生成  **tua** 的配置文件`.tuarc`，以及一个简单示例。并自动下载安装所需npm依赖。\n可以根据项目需要修改配置。见 `tua` 配置说明。\n\n3. 开始调试\n\n```shell\ntua start\n```\n\n启动服务器。\n\n4. 打开页面\n\n\t* 在浏览器中输入 [http://localhost:9527/hindex.html](http://localhost:9527/hindex.html)  [http://localhost:9527/sports.html](http://localhost:9527/helloexpress)查看页面\n\n\t* 在浏览器中输入 [http://localhost:9527/helloexpress](http://localhost:9527/helloexpress) 查看直出页面\n\n## 2. 命令行接口(CLI)\n### 2.1. 初始化生成项目模板\n```shell\ntua new\ntua n\n```\n执行后，会在执行目录下生成项目模板。\n\n#### 2.1.1. 模板结构\n```\n+ app          代码源文件\n    + lib        公共代码库\n        utils.js   公用的js\n    a.js\t\t\t 异步模块\n    index.js      入口\n    index.html    html模板\n    index.scss    sass文件\n    sports.html   html模板\n    sports.js     入口\n+ server\n    boot.js    适配服务端框架的直出启动文件（比如tsw）\n    index.js   直出入口\n    sports.js  直出入口\n+ test         测试文件\n    add.js     测试文件\npackage.json   包配置文件\n.editorconfig  编辑器配置文件\n.gitattributes Git配置\n.gitignore     Git忽略提交规则\n.tuarc         tua配置文件\nREADME.md      项目说明文件\n```\n#### 2.1.2. 自动下载\n在生成 package.json 后，npm 包的自动安装会启动。优先使用 yarn 安装，如果没有安装则会选择 npm。\n\n### 2.2. 生成DLL文件 Deprecated\nDLL是套用window中动态链接库的概念。\nDLL的使用，是webpack优化的一部分。\n把变化不频繁的部分（如 vue react 的库文件等）打到DLL包中，可以提升调试阶段和发布阶段的编译速度，节省时间，提升效率。\n如需了解详情，请自行google，这里不再累述。\n\n```shell\ntua dll\n```\n此命令无需手动执行，在使用 `start` 或 `pack` 时，程序会自动检测是否需要生成或更新 DLL 文件。\n\n### 2.3. 启动本地调试服务器\n#### 2.3.1.  使用默认框架express\n```shell\ntua start\n```\n启动一个 webpack-dev-server(框架是express), 带有热更新。\n启动前，会检测是否需要更新 DLL 文件。\n\n#### 2.3.2 使用 koa\n默认情况下，webpack-dev-server 提供一个 express 的服务器，tua 额外提供对 koa 的支持，只需在此命令的末尾添加 `-k` 或者 `--koa`,\n```shell\ntua start --koa\ntua start -k\n```\n以上命令会启动 Koa 服务器。\n\n#### 2.3.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua start index\n```\n\n### 2.4. 打包\n#### 2.4.1. 打包本地使用\n```shell\ntua pack\n```\n打包后，资源路径都是本地相对路径，用于本地查看或html和资源部署到同一目录的情况。\n打包会同时打包客户端代码和服务端代码，服务端代码入口在 `serverEntry` 配置处设置。见下文详细说明。\n\n#### 2.4.2. 打包服务器使用\n```shell\ntua pack -t\ntua pack --toserver\n```\n打包后，资源路径指向 .tuarc 中配置的 `serverUrl`， 用于使用 CDN 或者 html 和资源部署到不同路径的情况。\n\n### 2.4.3.  给 pages 配置传递参数\npageEntries方法是入口的生成函数，见 3.6\n启动本地服务时，在 `start` 后添加字符串，可以当做参数传递给 `pages`方法，用于筛选页面等。\n\n```shell\ntua pack index\n```\n\n### 2.5. 启动测试\n\n需安装插件支持：@babel/test\n\n```shell\ntua test --stage {stage}\ntua test -s {stage}\n```\nstage的值从 [‘start', 'run', 'stop', 'init', 'completion'] 选择。\n\n集成了 `karma + mocha + chai + sinon` 的测试框架。\n需配置 .tuarc 中的 `testbase`，默认是 test 文件夹。\n\n### 2.6. 执行js文件\n```shell\ntua run filename\n```\n从目标文件启动，可自行封装start等命令。\n此文件中可以调用 tua 的模块，以及 tua 依赖的 npm 包。\n\n### 2.7. 新增模板\n\n需安装插件： @tuax/cli\n\n1. 初始化项目（代理 vue-cli v2 的 init 功能）\n\n```shell\ntua init <template-name> <project-name>\n```\n\n1. 新增 api\n\n```shell\n# 新增 web 端 api\ntua add api <api-name>\n\n# 新增小程序端 api\ntua add api <api-name> -w\n```\n\n2. 新增页面\n\n```shell\n# 新增 web 端 page\ntua add page <page-name>\n\n# 新增小程序端 page\ntua add page <page-name> -w\n```\n\n3. 新增组件\n\n```shell\n# 新增 web 端 comp\ntua add comp <comp-name>\n\n# 新增小程序端 comp\ntua add comp <comp-name> -w\n\n# 新增 web 端全局 comp\ntua add comp <comp-name> -g\n\n# 新增小程序端全局 comp\ntua add comp <comp-name> -g -w\n```\n\n### 2.8. 导出默认模板\n这个命令将包中的默认模板导出到 `.templates/` 中。\n\n这样通过修改`.templates/` 下的模板文件，即可实现自定义模板功能。\n\n```shell\ntua eject\n```\n\n### 2.9. 指定模板文件夹\n**读取模板的优先级逻辑是：**\n\n1. 首先尝试使用 `tua.config.js` 中的 `templateDir` 字段\n2. 接着尝试读取 `.templates/`\n3. 最后读取默认模板\n\n### 2.10 生成接口声明命令\n这个命令将读取导出的 apis 然后自动生成 `index.d.ts`。\n\n```shell\ntua declare [apisPath]\n```\n\n* `apisPath` 默认值为 `src/apis/index.js`\n* `index.d.ts` 将生成在 `apisPath` 同级目录下\n\n由于使用 `require` 读取导出 apis 对象的文件，所以可能会碰到 `alias` 问题。例如项目中设置了 `@` 作为 `./src/` 的别名。虽然 `@tua-mp/cli` 已内置了一些 `alias`，但你仍然可以自由配置。\n\n在 `tua.config.js` 中的 `alias` 选项会透传给 [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)，例如将 `foobar` 指向 './src/foobar' 可以这么配置：\n\n```js\n// tua.config.js\nmodule.exports = {\n    alias: {\n        'foobar': './src/foobar',\n    },\n}\n```\n\n## 3. 配置\ntua 的配置文件 `./.tuarc` 在执行初始化命令之后自动在项目的根路径下生成。\n.tuarc 是一个正规的 nodejs 模块，暂不支持ES6语法。\n以下是每一个配置项的说明。\n\n### 3.1. supportIe{Boolean} deprecated in 0.9.0\n打包后的文件是否支持 IE8。默认给出的选项是`false`。\nIE8 的支持需要一些特殊的库以及 webpack 插件的支持，当选项为`true`时，工作流会自动调整配置，以适应IE8的要求。\n注意： IE8的支持不完全，某些 ES6 的属性慎用。另外，如需搭配 vue 等不支持 IE8 的库，请自行查询如何配置loader和插件以提供兼容。\n\n注： 0.9.0 已经不再支持IE8。\n\n### 3.2. cssEnhance {Array<string, object> | string | object }\ncss 增强loader，单个loader配置符合 webpack 标准的loader配置\n\n注：需要在项目中安装插件支持 @tuax/plugin-css-preprocessor\n\n#### 3.2.1. 支持的loader\n* 内置css loader： sass，postcss，less\n* 本地安装的 css loader 需要加上 -loader，如使用本地安装特定版本的 postcss， 可配置成 postcss-loader\n\n#### 3.2.2. 关于 postcss\n默认配置中，postcss使用的插件如下：\n* postcss-smart-import\n* precss\n* autoprefixer\n\n配置文件生成规则如下：\n1. 自动生成 .postcssrc.js\n默认会根据浏览器环境配置 `env` 在项目根目录下生成 **.postcssrc.js**， 此文件使用 tua 包中默认安装的 postcss插件地址，因此每人机器上配置文件不同，不要上传到版本库。\n\n2. 用户自定义配置 postcss.config.js\n用户在定义了 postcss.config.js 的情况下，上述配置文件不会自动生成，如果已经生成，请手动删除，以免造成不确定性的bug。\n\n#### 3.2.3. 注意事项\n1. 数组对象配置的顺序符合webpack loader加载对象从右向左处理的顺序\n\n### 3.3. ~~ pretty {Boolean | Object} ~~\n是否在启动 webpack 时，使用[prettier](https://github.com/prmettier/prettier)自动格式化代码。\n如果需要格式化代码，则`pretty`的值应该是 [prettier](https://github.com/prettier/prettier) 的配置。\n\n### 3.4. enableProfile {Boolean}\n\n需要安装插件支持：@tuax/plugin-profile\n\n是否生成profile文件，profile可用于查看生成块的大小等信息。\n如果选是，打包完成后，会自动打开集成的profile工具，可方便的查看每个 chunk 的信息。\n\n### 3.5. env {Object}\n\n```js\n /**\n     * 定义浏览器环境，babel-preset-env 插件使用的环境\n     * browsers {Array<string> | string} 浏览器支持\n     *     或者 {\n     *              debug: {Array<string> | string}, 浏览器支持\n     *              publish: {Array<string> | string} 浏览器支持\n     *          }\n     * https://github.com/ai/browserslist http://browserl.ist/\n     */\n    browsers: {\n        debug: '',\n        publish: ''\n    }\n```\n\n可分别定义debug阶段和发布阶段打包支持的浏览器环境。\n在调试阶段把环境设置成固定的（比如 chrome） 可以加快编译速度，减少等待时间。\n\n### 3.6. pages {Function}\n配置项目的入口，重要属性，必须配置。 **路径中注意要统一使用 / , windows 中会使用 \\ ，需自行处理**\n值需要是一个匿名函数。\n```js\n/**\n * 生成entries入口的函数，返回数组类型，每个对象都应包括四项, 路径中注意要统一使用斜杠 / ,windows 中会使用 \\ ，需自行处理\n * @param param 用于过滤等功能的cli传过来的参数 两个命令可以传递此参数 tua start --param, 或者 tua pack -t toserver --param / tua pack --param\n * @return Object {\n *       index: {\n *           // page 的入口\n *          entry: './src/index',\n *           serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n *           // 模板来源\n *           template: 'src/index.html',\n *           inlineSource: '.css|js$', // embed all javascript and css inline\n *           // 在 dist/index.html 的输出\n *           filename: './hindex.html',\n *           // 当使用 title 选项时，\n *           // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n *           title: 'Index Page',\n *           // 在这个页面中包含的块，默认情况下会包含\n *           // 提取出来的通用 common, manifest\n *          chunks: ['common', 'manifest', 'index']\n *       },\n *       // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n *       // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n *       // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n *       // filename: ${pagename}.html\n *       sports: './src/sports'\n *   }\n * 支持 html-webpack-plugin 的所有配置，见： https://github.com/jantimon/html-webpack-plugin#user-content-options\n */\npages: function (param) {\n    return {\n        index: {\n            // page 的入口\n            entry: './src/index',\n            serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在，因此，每一个终端入口+.server 的方式命名的 js 文件都是此页面的ssr方式的入口\n            // 模板来源\n            template: 'src/index.html',\n            inlineSource: '.css|js$', // embed all javascript and css inline\n            // 在 dist/index.html 的输出\n            filename: './hindex.html',\n            // 当使用 title 选项时，\n            // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>\n            title: 'Index Page',\n            // 在这个页面中包含的块，默认情况下会包含\n            // 提取出来的通用 common, manifest\n            chunks: ['common', 'manifest', 'index']\n        },\n        // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时，\n        // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾，去掉 .js， 如果没有，为非同构页面\n        // template: `src/${pagename}.html`  如果找不到，使用 src/default.html 如果还没有，使用 tua 自带默认模板\n        // filename: ${pagename}.html\n        sports: './src/sports'\n    }\n}\n```\n参数 函数接受一个参数，可以在 `start` 或 `pack` 阶段，用 `--param` 的方式传递过来，常用于优化调试速度，或部分打包上线。默认会打包所有页面。\n返回值需要是一组符合上述结构的对象。\n\n### 3.7. html {Object}\nhtml-webpack-plugin 中关于html生成的压缩配置。见:[https://github.com/kangax/html-minifier#options-quick-reference](https://github.com/kangax/html-minifier#options-quick-reference)\n\n### 3.8. testbase {String}\n@tuax/test 扩展属性，测试文件路径\n\n### 3.9. dist {String}\n打包代码输出的文件夹路径，需要是绝对路径。\n\n### 3.10. ~~src {String}  Deprecated~~\n代码source路径，缩小loader的处理范围。\n已失效。\n\n### 3.11. assertsLimit {Integer}\n大小小于 {assertsLimit}B 的资源，会自动base64到代码中。\n\n### 3.12. serverUrl {String}\n执行打包到 toserver 时，静态资源会上传至cdn，此为静态资源文件夹地址。\n\n### 3.13. open {String | Boolean | Object}\n是 webpack-dev-server 中 open 和 openPage 的缩写，其中\n\n#### 3.13.1. open 设置为浏览器类型\n```js\nopen : 'google chrome'\n```\n\n#### 3.13.2. open设置为布尔值时\n```\nopen : false\n```\n值 false 时，不自动打开浏览器。\ntrue时，打开当前服务地址\n\n#### 3.13.3. open设置为对象时\n```js\nopen : {\n    pathname: 'xxx.html',\n    app: 'google chrome'\n}\n```\n\n执行 `start` 后，启动服务器成功后浏览器打开地址。\n\n 如果 webpack 的 `devServer` 配置和`open`配置同时存在时，以 `open` 的设置为准，`open`不存在时，以`devServer`的配置为准\n\n### 3.14. devServer {Object}\n```js\n{\n    proxy: {\n        \"/api\": {\n            target: \"http://localhost:3000\", //代理的服务器地址\n            bypass: function (req, res, proxyOptions) {\n                //过滤器\n            }\n        }\n    },\n    port: 9527,\n    localhost: 'a.com',\n    // 匹配一直的参数会追加到url中\n    // [\n    //    [rule1, param1],\n    //    [rule2, param2]\n    // ]\n    // rule 可以是 String 类型或者正则表达式\n    // 优先匹配到的先生效 比如 [[/s/,'?a=bb'],['sports.html':'?b=aa']]， 后面这条永远不会生效\n    defaultParams: [\n        [],\n        []\n    ]\n}\n```\n\n可设置proxy和端口号，以及快捷启动的localhost映射域名\nlocalhost 设置后，在非windows系统中，tua 会自动帮您设置host，并在退出时清理自动设置的host，请根据提示输入管理员密码。\n\n### 3.15. resolve {Object}\n```js\n{\n    /**\n     * 别名配置，可以配置短路径和文件\n     * eg. \"jquery\" : require(\"./lib/jquery\")\n     */\n    alias: {\n        // \"jquery\" : require(\"./lib/jquery\")\n    }\n}\n```\n可配置别名，如上例为 jquery 配置了别名。\n\n### 3.16. globalVar {Object}\n为某些模块配置全局变量。\n如：\n```js\n{\n    $: 'jquery'\n}\n```\n\n### 3.17. dll {Object}\n\n配置dll块，可配置需要打包成dll的块\n如：\n\n```js\n{\n    chunks: {\n        // vendor: ['./src/lib/utils'],\n            vendor2: ['./src/lib/utils'],\n    },\n}\n```\n\n### 3.18. ~~serverEntry~~\n\n合并配置到 pages.\nserverEntry 应该是一个 Object 类型的值，或者是一个函数，返回 Object 类型的值\n\n```js\nserverEntry : {\n    index : './server/index'\n}\n// or\nserverEntry : function(params){\n    return {\n        index : './server/index'\n    }\n}\n```\n\n如果是函数类型，则会在执行时，接受 `tua start` 或 `tua pack` 命令传递过来的参数，可以用于过滤等操作。\n\n#### 3.18.1. 入口\n\n入口模块必须默认是一个方法，支持两种形式，es5的模式\n\n```js\nmodule.exports=function(server){\n\n}\n```\n\n或者 es6 模式\n\n```js\nexport default (server)=>{\n\n}\n```\n\n方法需从 server 对象中获取 router 和 app 等用于创建路由和后台直出。\n\n```js\n//index.js\nmodule.exports = function (server) {\n    const router = server.router;\n    const app = server.app;\n    //koa example\n    router.get('/bbbf', function (ctx) {\n        ctx.type = 'text/html';\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        ctx.body = htmlcode + ' for koa!';\n    })\n//express example\n    router.get('/bbbc', function (req, res, next) {\n        let htmlcode = server.mfs('/app/index.html', 'utf-8');\n        res.send('for express： ' + htmlcode);\n    })\n}\n```\n\n#### 3.18.2. 入口接收的 server 对象\n\ndebug 阶段的 `server`是`webpackDevServer`的实例，常用到的属性和方法如下\n\n```js\n{\n    app: {koa or express}\n    router: {koa-router Object or express router Object}\n    mfs: {Function}\n}\n```\n\n#### 3.18.3. mfs 方法\n\n```js\n/**\n* 读取html模板的代码\n* @param htmlPath 源代码中，html文件的路径\n*/\nfunction mfs(htmlPath){}\n```\n\n注意，路径需要以 '/' 开头，对应项目根目录。\n\n#### 3.18.4. 使用打包后的服务端文件\n\n打包后，会生成 `dist/server.js`, 此文件中不包含服务器创建部分，因此，使用时，需要根据入口文件中使用到的server的属性，创建相应的对象\n\n以使用`koa`为例，boot.js,\n\n```js\nrequire('source-map-support').install();//支持 sourcemap\nconst entry = require('./dist/server/index');\nconst Koa = require('koa');\nconst Router = require('koa-router');\n // 初始化koa实例\nconst app =  new Koa(); // eslint-disable-line\nconst router = new Router();//初始化koa router\n\napp.use(router.routes()).use(router.allowedMethods()); //绑定路由\nentry({\n    app: new Koa(),\n    router: new KoaRouter()\n})\n```\n其中， `source-map-support` 需要在服务端安装npm包。非必须，不需要可删除。\n\n### 3.19. babelrc\n```js\n/**\n * {\n *    include: [],\n *    presets: {Array<string> | string}\n *    plugins: {Array<string> | string}\n *  }\n */\n{ \n    include: [/regs/],\n    presets: {Array<string> | string},\n    plugins: {Array<string> | string}\n}\n```\n用于扩展 .babelrc，例如，如果需要使用react，需要这么写：\n```js\n{\n    presets: [\"react\"]\n}\n```\n\n#### include\n默认配置中`babel-loader`编译会排除 `node_modules`，但是内部发布的很多包会直接发布未编译成es5的版本，因此 `node_modules` 中某些部分应该被babel编译。\n`include` 是包含正则表达式的数组构成。\n\n#### 版本升级指引\nbabel7 在tuax中的支持版本始于 0.9.17， 不兼容babel6的配置。\n\nbabel7 进行了大量的重构，可先根据 babel 官网进行 babel6 到 babel7 的升级。\n\n升级到 tuax 0.9.17 及以上时，需要修改的点有两个：\n\n* 配置本地需要的运行时库\npackage.json 中需要配置的 babel 包：\n\n```js\n\"dependencies\": {\n    \"@babel/runtime\": \"latest\",\n    \"@babel/runtime-corejs2\": \"latest\"\n}\n```\n\n* 在 .tuarc 中配置 babel 支持新语言特性的 plugin，比如，装饰器等，插件如下：\n\n```js\n    babelrc: {\n        // 可以使用以下配置尝试新功能, 注意需要安装后使用\n        // plugins:[\n        //     \"@babel/plugin-proposal-class-properties\",\n        //     [\"@babel/plugin-proposal-decorators\", {legacy: true}],\n        //     \"@babel/plugin-proposal-do-expressions\",\n        //     \"@babel/plugin-proposal-export-default-from\",\n        //     \"@babel/plugin-proposal-export-namespace-from\",\n        //     \"@babel/plugin-proposal-function-bind\",\n        //     \"@babel/plugin-proposal-function-sent\",\n        //     \"@babel/plugin-proposal-json-strings\",\n        //     \"@babel/plugin-proposal-logical-assignment-operators\",\n        //     \"@babel/plugin-proposal-nullish-coalescing-operator\",\n        //     \"@babel/plugin-proposal-numeric-separator\",\n        //     \"@babel/plugin-proposal-optional-chaining\",\n        //     [\"@babel/plugin-proposal-pipeline-operator\", { \"proposal\": \"minimal\" }],\n        //     \"@babel/plugin-proposal-throw-expressions\",\n        // ]\n    }\n}\n```\n\n如果需要使用装饰器，需要在package.json中引入并下载 `@babel/plugin-proposal-decorators`，然后，将 tuax 中对应的插件打开即可使用。\n\n### 3.20 plugins\n\n用于配置 tua 的插件，现在内置拆件有以下几个，安装在项目根目录下后，方可使用\n\n```js\n[\n    [require(pluginname), pluginOptions]\n    require(pluginname) \n]\n```\n也可以引入自定义插件\n\n\n#### 3.20.1 插件列表\n\n##### @tuax/cli\n\n扩展 tua 脚手架，可以方便的生成模板以及添加模块等\n内置，无需安装\n\n##### @tuax/plugin-babel\n\nbabel支持，内置，无需安装\n\n##### @tuax/plugin-test\n\n见testbase\n支持测试\n\n##### @tuax/plugin-profile\n\n见 enableProfile\n支持打包情况查看\n\n##### @tuax/plugin-imgmin\n\n支持图片压缩\n\n##### @tuax/plugin-css-preprocessor\n\n见 cssEnhance\n支持css预处理\n\n#### 3.20.2 自定义插件\n\n实现以下方法即可\n\n```js\n\n/**\n * 扩展命令行\n * @param yargv yargs 对象 见： [yargs](http://yargs.js.org/docs/)\n * @param options 插件配置\n */\nmodule.exports.command = function (yargv, options) {\n\n}\n\n/**\n * 初始化option，设置扩展字段的校验和默认值\n * 扩展 .tuarc 配置\n * 见： [joi](https://github.com/hapijs/joi)\n * @param joi对象\n * @param options 插件配置\n * @return {Object}\n * {\n *     pluginScheme: joi scheme\n *     pluginDefaultOptions: 默认值\n * }\n */\nmodule.exports.options = function (joi, options) {\n    return {\n        pluginScheme: {\n\n        },\n        pluginDefaultOptions: {\n\n        }\n    }\n}\n/**\n * 扩展客户端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.clientConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.serverConf = function (chainedConfig, env, config, options) {\n\n}\n/**\n * 扩展服务端 webpack 配置\n * @param chainedConfig webpack-chain对象 见： [webpack-chain](https://github.com/neutrinojs/webpack-chain)\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.dllConf = function (chainedConfig, env, config, options) {\n\n}\n\n/**\n * webpack 开始编译前的z准备\n * @param env 当前环境， 包括 DEBUG，PUBLISH，TOSERVER，对应命令执行的三个阶段\n * @param config  .tuarc 配置和默认配置合并后的最终配合\n * @param options 插件配置\n */\nmodule.exports.beforeCompile = function (env, config, options) {\n\n}\n\n/**\n * 扩展项目的package.json, 注入配置\n * @param options 插件配置\n * @return {Object} package.json的配置扩展\n */\nmodule.exports.generate = function (options) {\n    return {}\n}\n\n```\n\n## 4. 进阶\n### 4.1. 直接调用 tua 时的参数传递\n**.tuarc** 配置文件中的 **pageEntries** 方法可以接收一个名为 `params` 的参数：\n```js\npageEntries: function (params) {\n   //params可以用于过滤入口和html文件\n   return entryDatas;\n}\n```\n这个参数在过滤入口和页面时会显得尤为有用，它可以通过执行 `start` 或 `pack` 后添加 `--param` 来添加\n```shell\ntua start --param xxx\ntua pack --param xxx\ntua pack --param xxx -t toserver\n```\n#### 4.1.1. 调用配置在 npm scripts 中命令的参数传递\n**npm scripts**中可以很方便的配置命令行，可以结合其他命令，方便调用。\n比如：\n```js\n \"scripts\": {\n    \"toserver\": \"rimraf dist/* .cache-loader/* && tua pack toserver && kcms -c\"\n  }\n```\n但，使用这种方式的时候，无法给**pageEntries**方法传递参数。\n\n为了支持 **npm scripts** 中调用**tua**命令时传递参数，需要设置 **npm** 的参数 `--params`：\n```shell\nnpm run toserver --params=xxx\n```\n这时，.tuarc 中的 pageEntries 方法就会接收到 'xxx'。\n\n#### 4.1.2. 使用 koa 作为服务器\n默认在webpack-dev-sever中，使用express作为服务器，但加载koa模块会略显复杂。\n\n`start` 在检测到最后一个参数为 `koa` 时，会启用 `koa` 作为服务器。\n\n```shell\ntua start koa\n\ntua start --param xxx -k\n```\n默认增加了对node端sourcemap的支持，方便定位问题。\n\n### 4.2. 设置目标浏览器环境\n#### 4.2.1. 不区分开发阶段的配置\n在 .tuarc 的配置文件中， `env.browsers` 可以用来设置目标浏览器。值可以是 `{Array<string> | string}`。\n```js\nenv:{\nbrowsers: {Array<string> | string}\n}\n```#### 4.2.2. 区分测试和发布阶段的配置\n一般，在debug模式下，可以只支持chrome就可以完成开发。\n```js\nenv:{\n    browsers: {\n         debug: {Array<string> | string},\n         publish: {Array<string> | string}\n    }\n}\n```### 4.3. 使用工具中的模块\n#### 4.3.1. 获取当前环境\n```js\nlet env = require(\"@tua/utils/env\");\nconsole.log(env.DEBUG);\nconsole.log(env.PUBLISH);\nconsole.log(env.TOSERVER);\n```\n以上方式可以获取当前是处于 `DEBUG`,`PUBLISH`,`TOSERVER` 的状态，方便自助扩展webpack使用。\n\n#### 4.3.2. 自定义启动文件\n执行命令\n```shell\ntua run -f start.js\n```\nstart.js\n```js\nlet tua = require(\"@tua\");\ntua.start();\n```\n以上代码可以启动 `dev server`。\n可用的 tua API，见下面部分。\n\n## 5. API\n### 5.1. .DLL(suc, fail)\n根据 **tua.js** 中的配置，生成 **dll** 文件。\n##### 5.1.1. suc\n生成dll文件成功后的回调\n##### 5.1.2. fail\n生成dll失败后的回调\n\n`suc`和`fail`都是可选参数。\n\n### 5.2. .start(params, callback, spinner)\n启动服务器\n##### 5.2.1. params\n参数，可用于过滤入口\n##### 5.2.2. callback\n启动服务器成功后的回调\n##### 5.2.3. spinner\nwebpack的devserver启动中，需要此对象展示阶段性信息，不传默认不展示。\n\n三个参数都是可选。\n\n### 5.3. .pack(stat, params, suc, fail)\n\n打包发布项目\n\n##### 5.3.1. stat\n\nPUBLISH TOSERVER 两种选一，不传默认是PUBLISH\n\n##### 5.3.2. params\n\n参数，可用于过滤入口\n\n##### 5.3.3. suc\n\n成功回调\n\n##### 5.3.4. fail\n\n失败后的回调\n\n四个参数都是可选。\n\n## CHANGELOG\n\n### 2019-10-22 v0.10.4\n\nFix:\n\n* 修复只有非服务端渲染页面的情况下，没有提示url地址的bug\n\n### 2019-10-22 v0.10.3\n\nFix:\n\n* pack 打包阶段thread-loader创建的子进程中没有经过hack-require导致找不到类似webpack等安装到tua下的模块\n\n### 2019-10-10 v0.10.2\n\nNew feature:\n\n* pages 配置，返回的对象属性新增 entryCode， serverEntryCode , 支持配置一段代码为webpack的入口，可用于项目中动态生成入口文件，简化项目配置\n\n### 2019-09-25 v0.10.1\n\nNew feature:\n\n* 在debug阶段，sever端也支持编译输出到内存中，减少IO，优化编译速度\n\n### 2019-09-15 v0.10.0\n\nBreaking changes:\n\n* 删除了pageEntries 和 serverEntry，合并到pages\n* 删除了 dllChunk，扩展新字段 dll，原dllChunk值可设置为 dll.chunk\n* 不再默认支持图片打包，需安装插件支持\n* 不再默认支持webpack打包块查看，需安装插件支持\n* 不再默认支持css增强，需要本地安装插件支持\n* 不再默认支持单元测试，需要本地安装插件支持\n\nNew feature:\n\n* 全新的命令行\n  * 更加语义化的命令行\n  * 新增全新脚手架\n  * 无效命令检测\n  * 启动执行速度优化\n* 新的配置文件 .tuarc\n  * 约定大于配置，配置大大简化，0配置即可运行\n  * 新增 .tuarc 配置校验\n  * 新增webpack链式扩展，chainClientConf，chainServerConf\n  * 简化配置，合并了serverEntry 和 pageEntries 为 pages，并提供了方便的根据文件夹生成配置的默认方法\n* 新增插件支持\n* 优化输出展示\n  * webpack bar展示进度\n  * 打包成功后，展示可用服务列表\n  * 打包后，集中展示所有错误，便于发现问题\n  * 新增 devServer.localhost 可配置 localhost 映射地址\n  * 支持devServer的新配置 defaultParams，可配置启动时提示url的参数\n* 安装包瘦身，安装更快\n* 服务端编译支持 HMR\n* 优化服务端编译速度，忽略node端不需要处理的类型\n\nBug fix:\n\n* 新建项目没有 src 文件夹的问题\n* babel7.0后 treeshaking 修复\n* cache-loader 等缓存位置变化，没有及时清理导致打包不更新\n* 开启 MD5 hash 情况下，动态import css问题修复\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题 \n* 修复 htmlplugin 中变量无法被解析问题，使用文件的 watch 代替 raw-loader\n\n### 2019-04-28 v0.9.28\n\n* 修复ios10中`terser`依赖包`uglify-js`在压缩代码时，当你定义一个与参数同名的for循环迭代变量时，ios10版本Safari会错误地认为这是一个语法错误的问题\n* 为`babelrc`添加`include`配置，解决`node_modules`中存在未编译成es5模块被引用无法编译的问题。\n\n### 2019-03-20 v0.9.27\n\n* 紧急修复 webpack-dev-middleware@3.6.1 无法启动的问题\n* 修复htmlplugin中变量无法被解析问题， 暂时去掉 html 修改触发 hmr 的功能\n\n### 2019-02-26 v0.9.26\n\n* 使用 terser 代替 uglify 压缩\n* 去掉.tuarc 中的 src 配置项\n\n### 2019-01-31 v0.9.25\n\n* serverEntry支持动态返回，可根据命令行参数进行入口过滤\n* 无效命令会有提示\n\n### 2019-01-22 v0.9.24\n\n* babel-loader 去除默认对node_module的忽略配置。\n* 解决了html和直出服务端文件修改无法触发hmr的bug\n\n### 2018-12-06 v0.9.21\n\n* babel-loader 起作用的范围支持数组，对应tuarc中的 src 配置项。\n\n### 2018-12-06 v0.9.20\n\n* open bug fix，把open为对象时的uri属性名改为pathname\n\n### 2018-11-22 v0.9.17\n\nbreaking change\n* babel7 支持\n\n#### 升级指引\n见 3.19\n\n### 2018-11-20 v0.9.16\n\n* 修复直出debug模式下 HMR 的问题\n\n### 2018-11-08 v0.9.15\n\n* devServer配置 https 支持\n\n### 2018-10-17 v0.9.12\n\n* 修复 md5hash 失效的问题\n\n### 2018-10-08 v0.9.11\n\n* 修改在 webpack.config.js文件中直接 require('webpack') 可能引用不到tua中安装的webpack导致错误的问题。\n  根据包查找规则，距离近的webpack会被先找到，找不到的才会被tua的requirehack修正到tua中。现在改为强制使用tua中安装的版本，为了可以使不同版本的webpack共存。\n\n### 2018-09-26 v0.9.10\n\n* 更新 postCSS 插件，添加 cssnano 压缩，解决 autoprefixer 添加的前缀被 optimize-css-assets-webpack-plugin 删除的问题\n\n### 2018-09-26 v0.9.5\n\nBreaking changes:\n* 简化webpackserver端配置，减少不必要的处理步骤，提升性能。\n\n### 2018-09-23 v0.9.3\n\nBreaking changes:\n* 文件名生成使用文件内容的MD5hash，用作永久缓存和客户端文件完整性校验。\n\n### 2018-09-17 v0.9.1\n\nBreaking changes:\n* 梳理命令行，重新定义了命令。\n\n### 2018-05-30 v0.8.38\n\n* 更名：属性 pageEntrys 更名为 pageEntries，兼容原方法\n* 开放html-webpack-plugin的配置，可直接在pageEntry中使用官方属性配置，详见：https://github.com/jantimon/html-webpack-plugin#user-content-options\n* 删除 html 配置，并入 pageEntries 中\n\n### 2018-05-17 v0.8.37\n\n* 解决Thread-loader创建的子进程中无法加载 tua 中已安装的npm包的问题\n\n### 2018-05-14 v0.8.36\n* 增加在 `pageEntries` 方法中，支持 css 和 js 的内嵌配置 `inlineSource`\n* 修复若干 bug\n\n### 2018-04-30 v0.8.31\n* 修正服务端HMR后内容不更新的问题\n\n### 2018-04-27 v0.8.29\n* 支持服务端多入口配置\n\n注意：serverEntry 值类型改为Object\n\n### 2018-03-27 v0.8.26\n* 支持异步加载块 import()\n\n### 2018-03-26 v0.8.25\n* uglify 压缩打包默认输出 sourcemap\n\n### 2018-03-15 v0.8.23\n* 增加测试阶段服务端（node）sourcemap 支持\n* 增加服务端线上环境 sourcemap 支持\n\n### 2017-11-20 v0.8.19\n* 开发模式兼容 windows\n* loader配置路径兼容 windows /转为\\\n\n### 2017-11-16 v0.8.18\n* 解决使用 server.mfs 方法时，因 webpack 未打包好html文件造成的时序问题\n* 更新 webpack-dev-server\n\n### 2017-11-15 v0.8.17\n* 解决 pageEntrys 中 htmlsrc 使用同样的模板，导致 server.mfs 无法通过源路径找到生成的html的问题\n\n### 2017-11-8 v0.8.15\n* 解决 .cache-loader 找不到的时序问题\n\n### 2017-11-2 v0.8.14\n* node端代码打包也支持profile查看打包后的模块了\n* 解决服务端代码external外部模块找不到模块的问题\n\n### 2017-11-1 v0.8.13\n* 修复了路由挂载post请求无效的问题。\nserve-index 会过滤掉所有的非 `GET` 和 `HEAD` 请求，需要在此之前处理 koa-router 的挂载\n\n### 2017-10-30 v0.8.12\n* 调整了koa router中间件的挂载位置，使不影响koa其他中间件的挂载（setup和before等）\n* 更换了koa中的 connect-history-api-fallback\n\n### 2017-10-30 v0.8.10\n* 优化了对模板html的读取，现抽象出 server.mfs 方法用于读取html文件\n\n### 2017-10-24 v0.8.7\n* dll 文件自动插入html，无需再手动引用\n\n### 2017-10-19 v0.8.4\n* serverEntry 模块支持 es6 的 export default 形式\n\n### 2017-10-19 v0.8.1\n* webpack-dev-server 增加配置，支持在使用webpack--dev-middleware 之前和之后配置中间件\n\n### 2017-10-18 v0.8.0\n* 支持 SSR， 服务端 js 支持热更新\n* webpack-dev-sever 扩展支持 Koa2\n\n### 2017-08-09 v0.7.3\n* 更新依赖库版本\n* 更新webpack-dev-server到2.8.0\n\n### 2017-08-09 v0.7.0\n* 修复windows下项目配置文件tua.js在命令执行时会被系统默认打开的问题，改为更加合理的 .tuarc，tua命令在windows下会优先打开同名文件\n**注意: 旧项目中的 tua.js 会被自动重新命名为 .tuarc，请注意提交 .tuarc 到代码仓库。**\n\n### 2017-08-03 v0.6.5\n* 增强 cssEnhance 配置的能力，支持本地css loader，支持自定义postcss配置\n\n### 2017-08-02 v0.6.4\n* 修复 postcss 配置文件在 windows 中的生成的路径问题\n\n### 2017-07-31 v0.6.3\n* 去掉 webpack-chunk-hash 插件，此插件会导致内容不同的 manifest 文件名重名问题\n\n### 2017-07-26 v0.6.1\n* webpack 版本升级到 v3.4.1\n* uglify 版本升级到 v3.0.6\n* extract-text-webpack-plugin 版本升级到 v3.0.0\n\n### 2017-07-26 v0.5.29\n紧急修复 chunk-manifest-webpack-plugin v1.1.1 版本带来的 bug，暂时固定版本到 1.1.0\nerror 如下：\n```shell\nERROR in chunk manifest [entry]\nscripts/[name]_[contenthash]_aaa.js\nChunk.entry was removed. Use hasRuntime()\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.21-beta.2","_nodeVersion":"10.23.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-aNbDYQQhV4j8ZzEKOdq9Yf3/7+XVOEWt5TcRBQ1GeRZRE3Q91XoBoLaD7Pxsd1DY6gsz4pthVXIoI6OtewWehw==","shasum":"53e5011660c0ce56bf2959ca1fe36bda1b6d4fee","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.21-beta.2.tgz","fileCount":92,"unpackedSize":608312,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfvHKVCRA9TVsSAnZWagAAvVAP/iY9bx+U1hVNWSq82TFg\nUQczIRInBwP1hRPDZuowdheFI7PKjTZfK1Rnk87WE/XABGknPPJdWEOFaOFC\n9fT3nPq9pssyyFal2DwA9vWmQHZHOUElnwRWOHL+qB730XAJIKvlriS9jpY0\nNmjFHd1xbCRnVe8c24teVIPkPOcRGC5cEp1fMTEXN6nwqB2Csb/9tuOBJAUU\n0AMigOXiGRVpqQvBDpw2IrQ0N6WYvguQSCF9VvqTt8kbEDaQ2KfVU2dm2OOS\nXG/13e3Rj7Pa+eV/zQi+OLaKXdRoxMdeQ4tfINBcG7XH3iTxrV6fqTcLWVgq\nDR7XS6/zz2kFyqyAkgh0Hcr2JKJ+7Rj6aUpLSXFIfZ52Fw0wcygT+5bQe/ey\nXir6gI3hEl9c3kEOWSbigp/IHCUA838aXAFqEYEKM79zPDB7Zzjo1ScInQ/Y\n7Pv8ePNq/uWCnvjaQZpP9tpuoP0LSlKnXD/HcuJMbVk2Pr9SFXL+l2PkGDNE\ndaKu3MJ35Kzs2t44ZVNEjeRTrmafjX7QDfaPveRlqI/1csQcxJgRkssVtKCu\nHhLyfKGOaWeXGKOBDAzG6q6yBUv667q4NCigQrvv/cWrkl+tMtupziWBfPXr\nyKIScr47dUccuYQurFdlfRyABoZDoBIc9eBluWtqWJzhQ/TRdXSTDv/2qdX/\nrJo8\r\n=jk5r\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBGlhnpHOhlZMuNLd9CiLd89/OAwSMEr1fKUkdr6EJDsAiBQuWmGsOi4vaE92EQhRBmeIdNGxOIt1s/IJabaoT1QvA=="}]},"_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.21-beta.2_1606185620894_0.9097849928313215"},"_hasShrinkwrap":false},"0.10.22":{"name":"tua","version":"0.10.22","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.9","@tuax/html-webpack-inline-source-plugin":"^1.0.0","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hard-source-webpack-plugin":"^0.13.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","@tencent/eslint-config-tencent":"^0.7.1","@types/jest":"^26.0.8","eslint":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"dde15e8ba91e0da35c797cc2222699614677061a","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.22","_nodeVersion":"10.23.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-j32FDS12ldy0xuwr8OIOY4MDKDT9d/z5KCU+wgOfFjrd/vuNCC5R/hMrz7ND45d0GIukQG3xY0KRxFZpLNa4Qg==","shasum":"4fd42efb2c273fecf597fcf7c6d873b04869ea28","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.22.tgz","fileCount":90,"unpackedSize":279625,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgSdIxCRA9TVsSAnZWagAAh1UP/3Bu2ZMJnaiqOuCweq9v\nyhOEiAMYqf/+ugRNIXUbXHEMIIAoFq6KZU+u7VU8aOVCHIIleK2FIT16z5Op\nTNCleRLuwgrw9q766aoBx0FLIlbOhRbNJeJTsvoFtb2ihqOCERhM9/N+hf3W\npyLufgipFDxAIivSv2E8Ddju2811Ro7C6/qbxIL7r2WXxS+uYV9lY3Hydx9b\nqaNnLNY9VzUaxtgySwwB3iL6hpWkFnArQKX6KfHPWsDlNVJnZGXoqpoM/WSX\ndfQysCRB5DyygbC566i1jPNQXxNX74Wh+P/nA0GVeNmHK8kT0pEslPKXJkSt\nIzjYWpOq3VAjHgBFB67g2qYsYiJF635VnIzOA8L+x4gOg1cXYjaYgDnoeimy\n0rNzPmnMfbccawew6w7Md3W47ZvS2E+em7SdBCjkjG8eiLsvZBjrwSvcN5OG\n9SHtfI5bsTFHdMVc8ehEm3LBGdttrIvJEfeXXs2ap+DW1TN0W/fOYmbhbRQN\nKcXAd2EHnZ35li38cMSDKLzqDKXtnCjrd+If8VYA2mo2PFHQZu5aSXA4QdFN\n1EGI/9B1F4JjhGXXeR3DPNAcwnUT9Bme8jZn/1qHrLJ7O0h2xyLVOKWgiF3z\nWDyaQwWohjM0VRUMeLsMS1wz470UhvbvVzoHPkWf99FMxtkQp5cqE54V6FDl\n4DlK\r\n=gQVS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRt3zpioXUHQzes2MGH9kNt6gsQbkwwhmfXRppdzE8egIhAIaDQDaIG2U5Wc74AILulnzvUOjJTD96vPMXBw13dcM1"}]},"_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.22_1615450672528_0.8927867134835443"},"_hasShrinkwrap":false},"0.10.23":{"name":"tua","version":"0.10.23","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.9","@tuax/html-webpack-inline-source-plugin":"^1.0.1","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hard-source-webpack-plugin":"^0.13.1","hostile":"^1.3.2","html-webpack-plugin":"^4.5.2","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","@tencent/eslint-config-tencent":"^0.7.1","@types/jest":"^26.0.8","eslint":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"003271dcf6763fe2af9f42e018d8266f12126724","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.23","_nodeVersion":"10.23.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-lMhL6+bKPcOKypgjYp5dSDPgPr+bYY+gZkgm/Ik6eFJBt2byNFgQ8BOMjhdPMPPHSnA+7hmQYJjPKPVktVGfVw==","shasum":"eb2cc20c3bbc32b448f8fe6d0b443d201c55c447","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.23.tgz","fileCount":90,"unpackedSize":279120,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgSdstCRA9TVsSAnZWagAA5xoP/1omOym+aRp1WtIawOfR\nvsTLa80RY4SQL77Y3nlRtdNo+gXZr8mZt06bmyRgeTnBfSL6/XYeCnMgXYU+\ncujKDOgSBwe/rawy0dRFR81+Ud0jAw0vFUSg6+57ew6b1sB8HFnvMRMauSjD\nlTdZr50TvGyuQIY30A9MQiz+fBXQvTC5CiD5y0neFlJaL82XAilUQ0LnbD7T\n3zsAaMQ7qa10Y82V/NCOr3RIGRjpVHNnMXATBgYmedbYBkGt0XHLkXQVulJC\nz6RY/YCFtGwLB2/w5z9XnQijQB9YXM63zMfUGjhXDXHCXrv8lWSV3v4WRzpZ\nipudga613YbVDAHyfU4xADMLKiBKom+enPXha8QUnL/HzaDhlbd7QTzZrLNb\nDgZFYPfOxkPQ3UiQrxJS5vzYTIg6IwjYZJPsvZpxk6w8uusy/ABpWR+TDmqv\nMhRRus+D0sgFzF9zmjd+C55AqATY0cW6VOboEtmyZhSzXQhNho91qzyUh1bI\noviEVysj7pnW7XmvdQd52aSOVGpmWgz6rQBZjhDtw2YVPzWtOTwpXOAkS+Yh\nElr18voQXxm+Vg6MHPE7KRnAlmph5KERtth5fq0hcRTJLKcX5P5+uV0JYOyV\n9WQOs3Tmf7UZZlOaDtazorTFYCNXtkBcaQPcecwSyykM9p1SDtJJHIPEnG0C\n2Efw\r\n=WJRy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDCQj/WIZnqFP2vhrDDGklGFYGI3vTbsbNLx9kFJYbluQIgfG+N3Wsu2egIpROCq28De8gKUjBVJ+/32dVPV20jc/k="}]},"_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.23_1615452972774_0.9619472810404182"},"_hasShrinkwrap":false},"0.10.24":{"name":"tua","version":"0.10.24","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.9","@tuax/html-webpack-inline-source-plugin":"^1.0.1","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hard-source-webpack-plugin":"^0.13.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^4.0.0","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","@tencent/eslint-config-tencent":"^0.7.1","@types/jest":"^26.0.8","eslint":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"003271dcf6763fe2af9f42e018d8266f12126724","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.24","_nodeVersion":"10.23.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-Lt9WlEItIHKic5uxuiDXTwI1S2zwUc8FWYkRqXnpA3OsQyXXCtOC4pzLjdbbmqVx2RTZj2B0XnZpBmZ+4jEmTQ==","shasum":"f415681ace643db2c5dbcf8056de113743702672","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.24.tgz","fileCount":90,"unpackedSize":279473,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgSeSOCRA9TVsSAnZWagAA3AUQAIubsJ4Dle8uAgud3ASR\nsvBnlGFSDf5U89JQ8vB5ikH1SoEA1BHwJorL4BdNuLbvtGyzH9oGWJDczPYn\nV4/kx2jh2Uqy2ccAxLuqnQV8bfPcznO1l352LuiwZN+gzLXEDH4Hw1aluKkq\nvGd3ByIavA28iEISIhXVP/yODpsKOXq0sfDjm9ijpHmmVPGdfDd22EIwvMEK\nWPwYWPUT093zf6/JEAmgryxdNFO3tG+L2VZXFUrOVktImSjHkdgO15LDc1Bp\nS0jz+zak99GqHqSOdi1u8/8bxKn9mpbPb8ts24relbUt+TvypggvD3hlj53C\nJmIEVqZRcLov0tmpvlXX6mg5YMQC9E/MaeRT418fI5O888haQgKF7s5AKnb2\n0e48W6r9qy49XuvLRSPp3UMKFn7I/B4fuIv6b+F1dxPi62xv10RiQ8qG9f67\nGwBdI9hbuLeevbCgfnnDacBWqTTI0GxiIUwsbWfsSFfp2RUkxhcOkPZyHw7s\nkpMBFcYz9U0GnMPPNCDUo7/Zx+f+rf+yAURwBxsiJCQ1/9J8ahFIDRMuCj1j\na25M+vQ+Mf0Pf4F4yFxQyLxYs9xUSiGZUjQnXT9dO92r5J7kq504qx5LwAOo\nFkRMBFYc0mTuqxNI62GcnJfeO2uxemeW/eyLcBMZ0B3EEWGSUgYkTNFn0yJ5\nZ1Aq\r\n=RuP9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCuvILLLRA9lcNNzULZ/zN83I2y+QykNY2qSGtsBz145QIgLNwNj+sBDEBNL7Nw9WO7Czpmnxexu+ZT8/ykOXNVHG0="}]},"_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.24_1615455374115_0.3300900017969497"},"_hasShrinkwrap":false},"0.10.26":{"name":"tua","version":"0.10.26","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.9","@tuax/html-webpack-inline-source-plugin":"^1.0.1","@tuax/plugin-babel":"^1.0.9","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hard-source-webpack-plugin":"^0.13.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^5.0.0-3","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","@tencent/eslint-config-tencent":"^0.7.1","@types/jest":"^26.0.8","eslint":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"d1e0e01a5ada63d0c09f03cb2ddb11551b8e3438","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.26","_nodeVersion":"10.23.0","_npmVersion":"6.14.13","dist":{"integrity":"sha512-QEsANONOEEvRNf0nB/Av3+ff846SruPFwYLoeQuNoTMw4h87yp6vsodVJ8Kj1OoAkFVk0NY2WWm8/0k4R6HYbA==","shasum":"ac6928c6d01761ad577e6f0d0f178034059f7b24","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.26.tgz","fileCount":93,"unpackedSize":606358,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgzA67CRA9TVsSAnZWagAAuL4P/A+lLdFx41R37+JTNfO6\nH4F5xXxiSiDRmtFOs6bUPYeqt9iMr0weQq4hrHs+rP5Z+l4uSk7K1p9GD4hK\ndkJIFAU6nbRpqxZOs88HQvIe+4lpRuisuTT0Fcy9Tq1WoUacslReM7nJrM9H\no/n433v0fdYsWlB86yvdS2pZ/XerfJpUsrTtUcnLqd99mjUsz/tDlnwkH9Hn\n+bMKdLHxfndhA6IIqvlqiPdj6dtjImr9MYkZN237QZT8oqkL/a5P6HSpczqs\n2AYXjectAklkrksLbuwLUR1CJzMgjQGpNqRyG9CiwBYm/3bRM92po/xTC7/i\n7OMZK0eQirXT3hj8Bh/FENExnYXFCrA+yqE9QixQAXRzizs3gk6bR/Q1rYMl\n0PLyexJx1IVdVEn0LuWJEuktYUCPqpiTHAB35JT1yMVPp53onI4kDiFLXLfw\nSJdKJLwiRDfAVM0zAQJ8EEM9KupgIZl/OBNQySCcxtNzmNaWiXZFvG6PxL0o\nKQDPI4i6sTucrVtngiqeB1gU7HBujHpGK+SfsiKLZJrAs3cZwE1gRAi7YzYY\n592ZxRrGmRSB4LCfDdiuTSmlagTIord9DWqBjtA2q/A4KaHmG2MIHgQWGePN\nF34DTBdQIL+G1zBvTL9BQj3U7y5PiO23ay8u+OLl50xQHjV1qRToC2f+O9Wn\nHgDc\r\n=IiWf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDpSpOvJ0XATKgz6n/7+h29SCT/8epojWyuVV87jffZEgIhAOIht0hz+N8CPW1UhG2LBd+GT7F2j4x7cSBU+hmmE7ur"}]},"_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.26_1623985850566_0.3388711601085328"},"_hasShrinkwrap":false},"0.10.27":{"name":"tua","version":"0.10.27","description":"tua是一个基于webpack的工作流，集成了下一代开发语言，提供语言层面的支持，并封装了webpack的复杂度。","main":"lib/index.js","directories":{},"bin":{"tua":"bin/tua"},"scripts":{"build":"rm -rf lib && babel src -d lib","pub":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish && rm -rf lib","pub-next":"npm run build && echo '{}' > .tua-cache/tuaModList.json && echo '{}' > .tua-cache/tua.json && npm publish --tag next && rm -rf lib","pub-tuax":"npm run build && rm -rf tuax__next && mkdir ./tuax__next  && cp -R bin lib projectDemo LICENSE package.json README.md tuax__next && node pubnext.js && npm publish tuax__next && rm -rf lib  && rm -rf tuax__next","next:pm":"npm --no-git-tag-version version preminor","next:pr":"npm --no-git-tag-version version prerelease","test":"mocha --compilers js:@babel/register","Webpack-defaults":"webpack-defaults","docs:build":"vuepress build docs","docs:dev":"vuepress dev docs"},"eslintIgnore":["src/cli/templates"],"dependencies":{"@hapi/joi":"^15.1.1","@tuax/cli":"^1.0.9","@tuax/html-webpack-inline-source-plugin":"^1.0.1","@tuax/plugin-babel":"1.0.11","ansi-colors":"^4.1.1","assets-webpack-plugin":"^3.9.10","cache-loader":"^4.1.0","colors":"^1.3.3","css-loader":"^3.2.0","cssnano":"^4.1.10","escodegen":"^1.12.0","esprima":"^4.0.1","estraverse":"^4.3.0","file-loader":"^4.2.0","fs-extra":"^8.1.0","hard-source-webpack-plugin":"^0.13.1","hostile":"^1.3.2","html-webpack-plugin":"^3.2.0","ignore-loader":"^0.1.2","inquirer-fuzzy-path":"^2.1.0","koa":"^2.8.1","koa-router":"^7.4.0","koa-static":"^5.0.0","memory-fs":"^0.4.1","mini-css-extract-plugin":"^0.8.0","opn":"^6.0.0","optimize-css-assets-webpack-plugin":"^5.0.3","ora":"^3.4.0","outdent":"^0.7.0","require-from-string":"^2.0.2","shelljs":"^0.8.3","source-map-support":"^0.5.13","source-map-url":"^0.4.0","style-loader":"^1.0.0","terser-webpack-plugin":"^1.4.1","thread-loader":"^2.1.3","url-loader":"^2.1.0","webpack":"^4.39.3","webpack-chain":"^6.0.0","webpack-dev-server":"^3.8.0","webpack-log":"^2.0.0","webpack-merge":"^4.2.2","webpackbar":"^5.0.0-3","yargs":"^11.1.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/register":"^7.5.5","@babel/runtime-corejs2":"^7.6.0","@tencent/eslint-config-tencent":"^0.7.1","@types/jest":"^26.0.8","eslint":"^7.6.0","lerna":"^3.16.4","metro-memory-fs":"^0.55.0","mocha":"^6.2.0","vuepress":"^1.2.0"},"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"author":{"name":"lijianwu"},"license":"MIT","gitHead":"27d678ec4b1b203f532720f024a1cbb3acf9bb3a","bugs":{"url":"https://github.com/tuateam/tua/issues"},"homepage":"https://github.com/tuateam/tua#readme","_id":"tua@0.10.27","_nodeVersion":"10.23.0","_npmVersion":"6.14.13","dist":{"integrity":"sha512-bLMUSn1359gLERxTOUUREuD9mBhuCdNfg44kY6ftsVVU2YLssCDbNX3SemMdn04K609lEXu92MQDtqMfeYdvdQ==","shasum":"7dcd8666839c0c3bb50b05f1b0d8108b18457f01","tarball":"https://registry.npmjs.org/tua/-/tua-0.10.27.tgz","fileCount":93,"unpackedSize":589962,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICcK4KOOLXy3xAIxZC/Whv2/4bM94X+hf7M4hE6F8A7TAiEAmGRWEwCGz1aQv/71QH3WsE3qFWv0nzjVR1xOf13JEKA="}]},"_npmUser":{"name":"knightwu","email":"wulijian722@gmail.com"},"maintainers":[{"name":"knightwu","email":"wulijian722@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/tua_0.10.27_1637139815300_0.13413458753794827"},"_hasShrinkwrap":false}},"homepage":"https://github.com/tuateam/tua#readme","keywords":["工作流","webpack","babel","postcss","sass","less","karma","test","mocha"],"repository":{"type":"git","url":"git+https://github.com/tuateam/tua.git"},"author":{"name":"lijianwu"},"bugs":{"url":"https://github.com/tuateam/tua/issues"},"license":"MIT","readmeFilename":"","users":{"sternelee":true}}