ykit-config-yo

该插件是为 Hy2.0 项目量身定制的构建方案和开发服务。

关于 yo 的详细使用说明请查看 Yo 官方文档

Features

  • 支持一键初始化 yo 项目
  • 从 js export 中提取 css/scss 依赖并去重合并
  • js/css 的开发服务中间件
  • 通过动态链接库等方式提升编译构建性能

安装

根据项目需求可选择不同的安装方式。

创建项目

如果要创建新项目,首先创建一个空的项目目录,之后在项目目录下通过 init 命令一键生成脚手架。

  1. $ ykit init yo

为已有项目添加 yo 插件

在项目中执行:

  1. $ npm install ykit-config-yo --save

编辑 ykit.js,引入插件:

  1. module.exports = {
  2. plugins: ['yo']
  3. // ...
  4. };

dll 命令

dll 命令是对编译流程的一个优化。

由于 yo 依赖的库和组件很多,为了提升编译性能,我们通过 Webpack 的 DLLPlugin 将这些第三方模块打包成 lib.js,从而提升编译速度并更有效地利用客户端缓存。

构建和发布时插件都会自动调用该命令生成 lib.js,只有我们手动改了库中包含的模块并希望立即生效时才需要手动调用 ykit dll 命令。具体说明详见 Yo 官方文档-关于 lib.js

另外你也可以调用 ykit dll-min 来生成 production 环境下的 lib.js。这种 lib.js 去除了 React 内部的冗余代码和警告,并且性能要比普通的 lib.js好。可以模拟线上环境App的真实性能。

配置 chunk

一般情况下不需要手动配置 chunk 的 publicPathchunkFilename,如果有这种需求,可以通过如下配置实现:

  1. {
  2. modifyConfig: function(config) {
  3. config.output.local.chunkFilename = '[id].chunk.js';
  4. config.output.local.publicPath = '//' + path.join('q.qunarzz.com', projectDir, 'prd/');
  5. config.output.dev.chunkFilename = '[id].chunk@dev.js';
  6. config.output.dev.publicPath = '//' + path.join('q.qunarzz.com', projectDir, 'dev/');
  7. config.output.prd.chunkFilename = '[id].chunk@[chunkhash].js';
  8. config.output.prd.publicPath = '//' + path.join('q.qunarzz.com', projectDir, 'prd/');
  9. }
  10. }

其中 localdevprd 分别对应着本地,开发机和线上环境。

配置lib.js

默认情况下 lib.js 中包含了 ReactReactDOMBabel-PolyfillYo-Router四个依赖,如果你有更多的公用依赖需要打在 lib.js 中可以通过如下配置实现:

  1. {
  2. modifyConfig: function(config) {
  3. config.getVendor = function(vendors) {
  4. return vendors.concat('newLib');
  5. }
  6. }
  7. }

其中参数 vendors 是原有的四个依赖,你可以向其中加入新的 node_modules 中的依赖,也可以加入业务模块,这时候你需要提供一个相对于 src 文件夹的路径。

插件配置详情

  1. {
  2. module: {
  3. loaders: this.config.module.loaders.concat([
  4. {
  5. test: /\.js$/,
  6. exclude: /(node_modules|bower_components)/,
  7. loaders: ['happypack/loader']
  8. }, {
  9. test: /\.(scss|css)$/,
  10. loaders: [require.resolve('./loader/empty-loader')]
  11. }
  12. ])
  13. },
  14. devtool: 'source-map',
  15. plugins: this.config.plugins.concat[
  16. dllPlugin,
  17. envPlugin,
  18. happyPackPlugin,
  19. ]
  20. }