apack
服务于蚂蚁的静态构建打包工具, 和 webpack 类似, 但区别在于:
- apack 采用微内核设计, 由外部 loader 直接告知模块依赖关系.
- apack 采用多线程和磁盘缓存, 加速构建.
- 平均构建速度基本都在毫秒级, 在禁用磁盘缓存情况下, 构建速度也远快于 webpack.
快速上手
"entry": {
"index": "./src/entry/index.jsx"
},
"devDependencies": {
"@alipay/milk": "*",
"@alipay/milk-apack": "*"
},
"scripts": {
"milk": "milk"
}
如果你的项目使用了通过 <script>
标签引入的外部库, 比如 jQuery
, 那么还需要在 package.json
里面配置:
"externals": {
"jquery": "jQuery"
}
执行 tnpm install
.
var apack = require('@alipay/milk-apack');
exports.middlewares = [
apack({
publicPath: '.'
})
];
- 最后, 执行
tnpm run milk
, 然后浏览器访问 http://127.0.0.1:8000/
.
注意, 该快速上手假设你使用了 antd
的标准脚手架, 即: 项目根目录有 index.html
文件, 该文件引用的静态资源都位于根目录下, 即 <script src='./index.js'></script>
, <link href='./index.css'/>
如果你的项目不满足上面的约束, 请参考自定义配置文件一节.
参数配置
以下参数都为可选参数.
var apack = require('@alipay/milk-apack');
exports.middlewares = [
apack({
publicPath: '.',
outputPath: '.',
disableCache: false,
babelExclude: ['node_modules'],
babelInclude: null,
customConfig: function(originConfig) {
var oneEntry = process.env.ENTRY;
if (oneEntry) {
var newEntry = {};
newEntry[oneEntry] = originConfig.entry[oneEntry];
originConfig.entry = newEntry;
}
return originConfig;
}
})
];
默认情况下, babel
会处理 node_modules
目录之外的文件. 如果 node_modules
目录里面某个组件是 jsx 源码版本需要处理,
可以用如下方式配置:
var apack = require('@alipay/milk-apack');
var path = require('path');
function resolve(dir) {
return path.resolve(process.cwd(), dir);
}
exports.middlewares = [
apack({
babelExclude: null,
babelInclude: [resolve('./src'), resolve('./node_modules/@alipay/opbase-biz-components/src')]
})
];
通过以上方式, 已经可以满足大部分中台项目的构建. 如果还想加入自定义的文件处理器(loader)等高级配置,
请使用以下方式使用 apack.
自定义配置文件
- 首先, 在
package.json
中添加配置:
"scripts": {
"apack-build": "apack -o ./dist"
},
"devDependencies": {
"@alipay/apack": "^0.0.1",
"@alipay/apack-babel-loader": "^0.0.1",
"@alipay/apack-css-handler": "^0.0.1",
"@alipay/apack-css-loader": "^0.0.1",
"@alipay/apack-js-handler": "^0.0.1",
"@alipay/apack-js-loader": "^0.0.1",
"@alipay/apack-less-loader": "^0.0.1"
}
- 然后, 执行
tnpm install
. 完成后, 在项目根目录新建 apack.config.js
文件:
'use strict';
const jsLoader = require('@alipay/apack-js-loader');
const cssLoader = require('@alipay/apack-css-loader');
const lessLoader = require('@alipay/apack-less-loader');
const jsxLoader = require('@alipay/apack-babel-loader');
const scriptHandler = require('@alipay/apack-js-handler');
const styleHandler = require('@alipay/apack-css-handler');
const path = require('path');
module.exports = {
disableWatch: false,
disableCache: false,
compress: true,
outputPath: '.',
resolve: {
extensions: ['.js', '.jsx', '.less', '.css']
},
entry: {
index: './src/entry/index.jsx'
},
loader: [
jsxLoader({
include: [path.join(__dirname, 'src')],
}),
jsLoader(),
cssLoader(),
lessLoader()
],
handler: [
scriptHandler({
filename: '[name].js'
}),
styleHandler({
filename: '[name].css'
})
]
}
注意, 请将该文件里的 entry
项改成你的项目的入口.
$ tnpm run apack-build
然后就可以在 ./dist
目录里面找到构建好的文件.
Dev-Server
如果想能够像 webpack-dev-server
一样的开发, 可以使用 @alipay/milk
.
Milk 是一个极轻量的 koa 中间件容器封装, 本身不做太多事. apack
提供了一个 koa 标准中间件, 可以让 Milk 加载.
"scripts": {
"milk": "milk"
}
"devDependencies": {
"koa-static": "^2.0.0",
"@alipay/milk": "^0.3.1"
}
- 然后, 执行
tnpm install
. 完成后, 在项目根目录添加 milk.js
文件:
var staticServe = require('koa-static');
var apack = require('@alipay/apack');
var serve = require('koa-static');
exports.middlewares = [
staticServe('.'),
apack.middleware()
]
$ tnpm run milk
External
如果你在开发时启用 mock 功能, 或联调阶段代理数据, 可以在 milk 中配置使用更多的 koa 中间件. 详情请参考: Milk 快速指南
Bug & Todo
- 和 milk 结合时, 当 milk 文件修改, 重新加载时报错.
- Source Map 支持
- 多 entry 时, 当文件变化时, 只重新处理受影响的 entry