YKit 在每一个项目中都有一个单一的配置文件 ykit.js
。通过该文件可以灵活地扩展和配置你的项目。以下是一些常用配置:
YKit 插件是对一类配置和功能的封装。每一个插件都是一个 NPM 模块,命名规则为 ykit-config-<name>
,比如 ykit-config-yo
。
首先通过 NPM 安装相应插件:
$ npm install --save ykit-config-yo
之后在 ykit.js
中配置 plugins
来将插件引入。
module.exports = {
plugins: ['yo', 'react']
// ...
};
更多相关文档详见 YKit-插件。
通过该配置项可指定资源入口路径。
module.exports = {
plugins: ['qunar'],
config: {
// 基于当前源代码目录,默认为 "src"
exports: [
'./scripts/index.js', // 引入 <project_path>/src/scripts/index.js
'./styles/index.scss' // 引入 <project_path>/src/styles/index.scss
],
}
// ...
};
在 YKit 中,会实现目标目录(默认为 prd
)与源目录(默认为 src
)的对应。你可以将其理解成 Webpack 配置中的 output.path
和 context
,YKit 隐藏了其中的配置细节。
这种说法可能有点抽象,在本地开发过程中,是允许目标目录 prd
并不实际存在的。举例来说,当本地 server 接收到 /prd/script/index.js
的请求,会自动编译 /src/script/index.js
并返回结果,而并不会在 prd
目录下实际生成一个文件。
通过该配置项,你可以传入一个函数对当前的 webpack 配置(baseConfig
)进行修改。
在 ykit 中 output 是一个对象,它的属性是 ykit 打包的三种环境:
每个环境对象下面才是 webpack 的输出配置,比如你可以这样配置 ykit pack -m 的输出路径:
config.output.prd.path = 'dist';
或者通过 Object.assign 对已有的对象追加属性:
config.output.prd = Object.assign(config.output.prd, {
path: 'dist'
});
module.exports = {
plugins: ['qunar'],
config: {
exports: ['./scripts/app.js'],
modifyWebpackConfig: function(baseConfig) {
baseConfig.module.loaders.push({
test: /\.mustache$/,
loader: 'mustache'
})
return baseConfig;
}
}
};
注意使用该方法时尽量对配置项(loaders 或者 plugins 等)进行追加和合并操作,而不要覆盖掉原有配置。
如果是当前配置中已经存在 loader,则要进行替换操作:
module.exports = {
plugins: ['qunar'],
config: {
exports: ['./scripts/app.js'],
modifyWebpackConfig: function(baseConfig) {
// 替换处理 scss 原有的 loader
baseConfig.module.loaders = baseConfig.module.loaders
.map(function (loader) {
if (loader.test.toString().match(/scss/)) {
return {
test: /\.(sass|scss)$/,
loader: 'style-loader!css-loader!sass-loader'
};
}
return loader;
})
return baseConfig;
}
}
};
var myPluginA = require('myPluginA');
var myPluginB = require('myPluginB');
module.exports = {
plugins: ['qunar'],
config: {
exports: ['./scripts/app.js'],
modifyWebpackConfig: function(baseConfig) {
baseConfig.plugins = baseConfig.plugins.concat([
myPluginA,
myPluginB
])
return baseConfig;
}
}
};
module.exports = {
plugins: ['qunar'],
config: {
exports: ['./scripts/app.js'],
modifyWebpackConfig: function(baseConfig) {
baseConfig.resolve.alias = {
COMMON: '/src/scripts/common', // 实际使用时 require('COMMON/lib.js')
UTIL: '/src/scripts/util' // 实际使用时 require('UTIL/dateHandler.js')
}
return baseConfig;
}
}
};
YKit 允许项目在打包过程中添加钩子,可在不同的阶段对资源进行处理。所有钩子都支持同步和异步。
调用顺序:beforePack
-> beforeCompiling
-> afterPack
module.exports = {
plugins: ['qunar'],
config: {
// ...
},
hooks: {
// 打包前回调函数
beforePack: function(cliParams) {
// cliParams 指运行命令参数,如 -x 或者 --xxx
console.log('Do something first!');
},
// 编译前回调函数
beforeCompiling: function(cliParams, webpackConfig) {
// 在这里可以拿到编译配置 webpackConfig,并进行更改
console.log('Do something next!');
}
// 打包后回调函数
afterPack: function(cliParams, stats) {
// 可从 stats 对象拿到编译后数据
var callback = this.async();
// 添加异步钩子
setTimeout(function() {
console.log('Do sth async after pack!');
callback();
}, 1000)
}
}
};
可对 YKit 本地 server 进行开发效率方面的配置:
module.exports = {
plugins: ['qunar'],
config: {
// ...
},
server: {
hot: true, // 模块热更新,相当于 ykit server --hot,默认 false
overlay: true, // 开启后可在当前打开的页面提示打包错误,便于调试,默认 false
maxMiddleware: 5 // 缓存的资源数量,进行该限制主要是为了防止过多冗余模块重新编译,默认为 3
}
};
YKit 允许你添加自定义命令,功能类似于 npm scripts
,添加形式如下:
module.exports = {
plugins: ['qunar'],
config: {
// ...
},
commands: [{
name: 'mycmd',
module: {
usage: '输出 “abcde”',
run: function () {
console.log('abcde');
}
}
}]
};
此时你就可以在控制台中执行它。
$ ykit mycmd