mew-time
Version:
utils about the time.
169 lines (161 loc) • 4.72 kB
JavaScript
import webpack from "webpack";
export default {
/**
* webpack entry를 설정한다.
* @param {Array.<{name: string, files: Array}>} [data = []]
* @param {object} env
* @param {domain} domain
* @returns {{entry: *}}
*/
entry(data = [], { env, domain }) {
const hasCommon = data.some(d => d.name === "common");
const result = data.reduce((box, { name, files }) => {
box[name] = files;
if (env.dev && !hasCommon) {
files.unshift(`webpack-dev-server/client?${domain.host_addr}/`, "webpack/hot/only-dev-server")
}
return box;
}, {});
if (env.dev && hasCommon) {
result.common.unshift(`webpack-dev-server/client?${domain.host_addr}/`, "webpack/hot/only-dev-server")
}
return { entry: result };
},
/**
* webpack output을 설정한다.
* @param {{path: string, publicPath: string}} data
* @param {object} env
* @param {object} domain
* @param {object} option
* @returns {{output: *}}
*/
output(data, { env, domain }, option) {
const result = env.prod
? {
path: data.path,
filename: "[name].[chunkhash].js",
chunkFilename: "[id].[chunkhash].js",
publicPath: data.publicPath ? `/${data.publicPath}/` : "/"
}
: {
path: data.path,
filename: "[name].js",
chunkFilename: "[id].js",
publicPath: data.publicPath ? `${domain.host_addr}/${data.publicPath}/` : `${domain.host_addr}/`
};
if (option && option.library) {
Object.assign(result,
option,
{
filename: `${option.library}.min.js`,
chunkFilename: `${option.library}.min.js`
}
);
}
return { output: result };
},
/**
* webpack commonChunks를 설정한다.
* @param {{chunks: Array, publicPath}} data
* @param {object} env
* @param {object} domain
* @returns {{plugins: [*,*]}}
*/
commonChunks(data, { env, domain }) {
return {
plugins: [
new webpack.optimize.CommonsChunkPlugin(data.chunks)
]
};
},
/**
* externals 옵션을 생성한다.
* @param {Array.<{path: string, alias: string}>} data
* @return {{externals: {}, module: {}, resolve: {}}}
*/
externals(data = []) {
return {
externals: data.reduce((box, d) => {
box[d.path] = d.alias;
return box;
}, {})
};
},
/**
* 글로벌로 변수를 선언한다.
* @param {Array.<{name:string, path:string}>} data
* @returns {*}
*/
expose(data = []) {
return data.length > 0
? {
module: {
rules: data.map(d => {
return {
test: require.resolve(d.path),
use: `expose-loader?${d.name}`
};
})
}
}
: null;
},
/**
* 접근이 용이하도록 alias 이름을 선언한다.
* @param {Array.<{name:string, path:string}>} data
* @returns {*}
*/
alias(data = []) {
return data.length > 0
? {
resolve: {
alias: data.reduce((box, d) => {
box[d.name] = d.path;
return box;
}, {})
}
}
: null;
},
/**
* webpack global로 사용할 변수를 선언한다.
* @param {object} variable
* @return {{plugins: [*]}}
*/
defineVariables(variable) {
return {
plugins: [
new webpack.DefinePlugin(variable)
]
};
},
/**
* 파일을 압축한다.
* @param {boolean} [sourcemap = false]
* @returns {{plugins: [*]}}
*/
minify(sourcemap = false) {
return {
plugins: [
new webpack.optimize.UglifyJsPlugin({
sourceMap: sourcemap
})
]
};
},
/**
* karma test를 위한 devSever 옵션을 가져온다.
*/
testServer() {
return {
noInfo: true,
watchOptions: {
aggregateTimeout: 300,
poll: 1000
},
stats: {
chunks: false
}
};
}
};