silki
Version:
Cli tool for build react app, based on generator-react-multipage, create-react-app, roadhog. Support react multiple pages app develop.
136 lines (130 loc) • 3.87 kB
JavaScript
const webpack = require("@ali/webpackcc/lib/build");
// const nativeWebpack = require("webpack");
const path = require("path");
const fs = require("fs");
const transform = require("./transformer");
const async = require("async");
const ROOT = process.cwd();
const generator = require("babel-generator").default;
const BASIC_PATH_PREFIX = path.join(ROOT, "./src");
// 组件的位置
const components = "./src/components";
const DEFAULT_WEBPACK_MODULES_PATH = path.join(ROOT, "./node_modules");
// "./node_modules"
const program = {
cwd: ROOT,
dev: true
};
/**
* 得到完整的文件路径
*/
function getFullPath(array) {
const fullPath = [];
for (let i = 0, len = array.length; i < len; i++) {
if (/^(\.|components)\S*/.test(array[i])) {
if (/^\.\S*/) {
// 相对地址,是相对index.test.js的,即src目录
fullPath.push(path.join(BASIC_PATH_PREFIX, array[i]));
} else {
//components这种
fullPath.push(path.join(components, array[i]));
}
} else {
fullPath.push(array[i]);
}
}
return fullPath;
}
/**
* 产生demo的内容
*/
function packJsBundle(jsFile, callback) {
fs.readFile(jsFile, "utf8", (err, data) => {
const id0imports = transform(data);
let fullPath = getFullPath(id0imports.imports);
const inputAst = id0imports.inputAst;
const sourceCode = generator(inputAst, null, data).code;
// 已经知道每一个文件的完整路径,我们需要构建webpack.config.js来完成构建打包到window上,借助async来顺序完成
const rules = [],
outputFiles = [],
entry = {};
for (let i = 0, len = fullPath.length; i < len; i++) {
const specifier = id0imports.specifiers[i];
entry[`${specifier}`] = fullPath[i];
outputFiles.push(specifier);
const TEST = /^\//.test(fullPath[i])
? require.resolve(fullPath[i])
: require.resolve(fullPath[i], {
paths: [DEFAULT_WEBPACK_MODULES_PATH]
});
rules.push({
test: TEST,
// 这里的require.resolve会是相对于silk来说的,所以找不到jquery这个库
use: [
{
loader: require.resolve("expose-loader"),
options: specifier
}
]
});
}
const webpackConfig = {
entry,
resolve: {
modules: [DEFAULT_WEBPACK_MODULES_PATH, "node_modules"]
},
output: {
path: path.join(ROOT, "./build")
},
node: {
child_process: "empty",
cluster: "empty",
dgram: "empty",
dns: "empty",
fs: "empty",
module: "empty",
net: "empty",
readline: "empty",
repl: "empty",
tls: "empty",
"aws-sdk": "empty",
console: false,
url: false
},
resolve: {
extensions: [
".web.js",
".web.jsx",
".web.ts",
".web.tsx",
".js",
".json",
".jsx",
".ts",
"tsx"
],
alias: {
components: `${BASIC_PATH_PREFIX}/components/`,
containers: `${BASIC_PATH_PREFIX}/containers/`,
utils: `${BASIC_PATH_PREFIX}/utils/`,
mods: `${BASIC_PATH_PREFIX}/mods/`,
images: `${BASIC_PATH_PREFIX}/images/`,
"react/lib/ReactMount": "react-dom/lib/ReactMount"
}
},
module: {
rules
}
};
program.config = webpackConfig;
console.log("webpack打包的配置为:" + JSON.stringify(webpackConfig));
webpack(program, (err, stats) => {
if (!err) {
console.log("打包demo资源成功.....");
// 回调:打包输出文件+div#id+源码+specifiers
callback(outputFiles, id0imports.id, sourceCode, id0imports.specifiers);
}
});
});
}
module.exports = packJsBundle;