From 74aae1946c9f25c8b1a4d82dd93bd715e5721b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=AA=89?= <974257574@qq.com> Date: Sat, 17 Jul 2021 15:03:34 +0800 Subject: [PATCH 1/2] feat: mini-webpack --- .gitignore | 4 +- 1.js | 24 ---- 2.js | 23 ---- bin/acli.js | 12 ++ index.js | 17 --- lib/Compiler.js | 107 +++++++++++++++++ myWebpack/ast.js | 130 -------------------- package-lock.json | 290 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 24 ++-- src/add.js | 3 - src/sub.js | 4 - src/test.js | 7 -- template/index.ejs | 26 ++++ webpack.config.js | 9 -- 14 files changed, 447 insertions(+), 233 deletions(-) delete mode 100644 1.js delete mode 100644 2.js create mode 100644 bin/acli.js delete mode 100644 index.js create mode 100644 lib/Compiler.js delete mode 100644 myWebpack/ast.js create mode 100644 package-lock.json delete mode 100644 src/add.js delete mode 100644 src/sub.js delete mode 100644 src/test.js create mode 100644 template/index.ejs delete mode 100644 webpack.config.js diff --git a/.gitignore b/.gitignore index 0841ed3..b512c09 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ -dist -node_modules -package-lock.json \ No newline at end of file +node_modules \ No newline at end of file diff --git a/1.js b/1.js deleted file mode 100644 index db558c6..0000000 --- a/1.js +++ /dev/null @@ -1,24 +0,0 @@ -__webpack_require__.r(__webpack_exports__); - - -__webpack_require__.d(__webpack_exports__, { - "default": () => (__WEBPACK_DEFAULT_EXPORT__) -}); - -let __src_test__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./src\\test.js"); - -let __src_sub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./src\\sub.js"); - -let name = __src_sub__WEBPACK_IMPORTED_MODULE_1__.subName; - -function self() { - ;(0, __src_test__WEBPACK_IMPORTED_MODULE_0__.default)(name); - ;(0, __src_test__WEBPACK_IMPORTED_MODULE_0__.default)(name); - let subName = 'self'; - return subName; -} - -self(); -;(0, __src_test__WEBPACK_IMPORTED_MODULE_0__.default)(name); -console.log((0, __src_sub__WEBPACK_IMPORTED_MODULE_1__.subFn)(20, 9)); -const __WEBPACK_DEFAULT_EXPORT__ = name; \ No newline at end of file diff --git a/2.js b/2.js deleted file mode 100644 index 1d30e86..0000000 --- a/2.js +++ /dev/null @@ -1,23 +0,0 @@ -__webpack_require__.r(__webpack_exports__); -__webpack_require__.d(__webpack_exports__, { - "default": () => (__WEBPACK_DEFAULT_EXPORT__) -}); -var _src_test__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./src/test.js"); -var _src_sub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./src/sub.js"); - - - -let name = _src_sub__WEBPACK_IMPORTED_MODULE_1__.subName - -function self () { - ; (0, _src_test__WEBPACK_IMPORTED_MODULE_0__.default)(name) - ; (0, _src_test__WEBPACK_IMPORTED_MODULE_0__.default)(name) - let subName = 'self' - return subName -} - -self() - ; (0, _src_test__WEBPACK_IMPORTED_MODULE_0__.default)(name) - -console.log((0, _src_sub__WEBPACK_IMPORTED_MODULE_1__.sub)(20, 9)) -const __WEBPACK_DEFAULT_EXPORT__ = (name); \ No newline at end of file diff --git a/bin/acli.js b/bin/acli.js new file mode 100644 index 0000000..01e81c1 --- /dev/null +++ b/bin/acli.js @@ -0,0 +1,12 @@ +#!/usr/bin/env node + +const path = require('path') +const fs = require('fs') + + +let config = require(path.resolve('webpack.config.js')) + +let Compiler = require('../lib/Compiler') + +let comipler = new Compiler(config) +comipler.start() \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index 1f61e64..0000000 --- a/index.js +++ /dev/null @@ -1,17 +0,0 @@ - -import helloworld from './src/test' -import { sub as subFn, subName } from './src/sub' -let name = subName - -function self() { - helloworld(name) - helloworld(name) - let subName = 'self' - return subName -} - -self() -helloworld(name) - -console.log(subFn(20, 9)) -export default name \ No newline at end of file diff --git a/lib/Compiler.js b/lib/Compiler.js new file mode 100644 index 0000000..c3ee3fa --- /dev/null +++ b/lib/Compiler.js @@ -0,0 +1,107 @@ +const path = require('path') +const fs = require('fs') +const parser = require('@babel/parser') +const traverse = require('@babel/traverse').default +const generator = require('@babel/generator').default +const ejs = require('ejs') +const { SyncHook } = require('tapable') + +module.exports = class Compiler { + constructor(config) { + this.config = config + this.entry = config.entry || './src/index.js' + this.root = config.root || process.cwd() + this.rules = config.module.rules || [] + this.output = config.output || { filename: 'bundle.js', path: path.resolve(this.root, 'dist') } + this.modules = {} + this.cacheLoaders = {} + + this.hooks = { + entryOption: new SyncHook(), + run: new SyncHook(), + compile: new SyncHook(), + make: new SyncHook(), + emit: new SyncHook(), + done: new SyncHook(), + } + + if (Array.isArray(config.plugins)) { + config.plugins.forEach(plusin => plusin.apply(this)) + } + this.hooks.entryOption.call() + } + + getSource (filePath) { + return fs.readFileSync(filePath, 'utf-8') + } + + start () { + this.hooks.run.call() + this.depAnalyse(this.entry) + } + + depAnalyse (entry) { + let filePath = path.resolve(this.root, entry) + + let source = this.getSource(filePath) + let ast = parser.parse(source) + let root = this.root + let dependenes = [] + traverse(ast, { + CallExpression (p) { + const { name } = p.node.callee + if (name === 'require') { + let oldPath = p.node.arguments[0].value + oldPath = `./${path.relative(root, path.resolve(path.dirname(path.resolve(root, entry)), oldPath))}`.replace(/\\+/g, '/') + dependenes.push(oldPath) + p.node.arguments[0].value = oldPath + p.node.callee.name = '__webpack_require__' + } + } + }) + dependenes.forEach((path) => { + this.depAnalyse(path) + }) + let code = generator(ast).code + this.modules[entry] = this.loadAndRunLoaders(code, filePath) + this.hooks.compile.call() + this.emit() + } + + emit () { + this.hooks.emit.call() + let template = fs.readFileSync(path.resolve(__dirname, '../template/index.ejs'), 'utf-8') + let result = ejs.render(template, { + modules: this.modules, + entryPath: this.entry + }) + fs.writeFileSync(path.join(this.output.path, this.output.filename), result) + this.hooks.done.call() + } + + loadAndRunLoaders (code, filePath) { + for (let i = 0; i < this.rules.length; i++) { + let { test, use } = this.rules[i] + if (test.test(filePath)) { + if (Array.isArray(use)) { + for (let j = use.length - 1; j >= 0; j--) { + let loader = use[j] + code = this.cacheLoader(loader, code) + } + } else if (typeof use === 'string') { + code = this.cacheLoader(use, code) + } else if (typeof use === 'object') { + code = this.cacheLoader(use.loader, code, use.options) + } + } + } + return code + } + cacheLoader (loader, code, options = undefined) { + if (!this.cacheLoaders[loader]) { + this.cacheLoaders[loader] = require(path.resolve(this.root, loader)) + } + code = this.cacheLoaders[loader].call({ query: options }, code) + return code + } +} \ No newline at end of file diff --git a/myWebpack/ast.js b/myWebpack/ast.js deleted file mode 100644 index 7698811..0000000 --- a/myWebpack/ast.js +++ /dev/null @@ -1,130 +0,0 @@ -const fs = require('fs') -const parser = require('@babel/parser') -const traverse = require('@babel/traverse').default -const types = require("@babel/types") -const generate = require('@babel/generator').default -const path = require('path') -const uuid = require('uuid') -const config = require('../webpack.config') - -const EXPORT_DEFAULT_FUN = ` -__webpack_require__.d(__webpack_exports__, { - "default": () => (__WEBPACK_DEFAULT_EXPORT__) -});\n -` - -const ESMODULE_TAG_FUN = ` -__webpack_require__.r(__webpack_exports__);\n -` - -function parseFile (file) { - const fileContent = fs.readFileSync(file, 'utf-8') - - const ast = parser.parse(fileContent, { sourceType: 'module' }) - let importFilePaths = [] - let importDefaultNames = [] - let count = 0 - let hasExport = false - traverse(ast, { - ImportDeclaration (p) { - let importPath = p.node.source.value - let importFile = path.join(path.dirname(file), importPath) - - importFilePath = `./${importFile}.js` - - importFilePaths.push(importFilePath) // 存储 当前文件引入的 所有其它文件 - - let localName = generatelocalName(importFile) - let covertName = `${localName}__WEBPACK_IMPORTED_MODULE_${count}__` - - let specifiers = p.node.specifiers - specifiers.forEach((specifier) => { - const name = specifier.local.name - const currentBinding = p.scope.getBinding(name) - currentBinding.referencePaths.forEach((referencePath) => { - if (referencePath.type === 'Identifier') { - let defaultName = `${covertName}.${name}` - if (!Object.prototype.hasOwnProperty.call(specifier, 'imported')) { - defaultName = `${covertName}.default` - referencePath.replaceWith(types.identifier(defaultName)) - } else { - referencePath.replaceWith(types.identifier(defaultName)) - } - importDefaultNames.push(defaultName) - } - }) - // importNames.push({ name: specifier.local.name, covertName: covertName }) - }) - // console.log(importNames) - // 创建一个变量定义的 AST 节点 - const variableDeclaration = types.variableDeclaration('let', [ - types.variableDeclarator( - types.identifier(covertName), - types.callExpression(types.identifier('__webpack_require__'), [ - types.stringLiteral(importFilePath) - ]) - ) - ]) - count++ - p.replaceWith(variableDeclaration) // 将当前节点替换为变量定义节点 - }, - ExportDefaultDeclaration(p) { - hasExport = true - // 跟前面import类似的,创建一个变量定义节点 - let name = p.node.declaration.name - if (!name) return - const variableDeclaration = types.variableDeclaration("const", [ - types.variableDeclarator( - types.identifier("__WEBPACK_DEFAULT_EXPORT__"), - types.identifier(p.node.declaration.name) - ), - ]) - - // 将当前节点替换为变量定义节点 - p.replaceWith(variableDeclaration) - }, - CallExpression (p) { - let calleeName = p.node.callee.name - if (importDefaultNames.includes(calleeName)) { - let parent = p.parent - if (parent && types.isCallExpression(parent)) { - // 如果父级是函数调用,则去掉 ";" - // 比如 console.log() 调用 - p.node.callee.name = `(0, ${calleeName})` - return - } - p.node.callee.name = `;(0, ${calleeName})` - } - } - }) - - let newCode = generate(ast).code - if (hasExport) { - newCode = `${EXPORT_DEFAULT_FUN} ${newCode}` - } - - newCode = `${ESMODULE_TAG_FUN} ${newCode}` - return { - file, - dependcies: [].concat(importFilePaths), - code: newCode - } -} -function parseFiles (entryFile) { - const entryRes = parseFile(entryFile) - let result = [entryRes] - for (let p of result) { - p.dependcies.forEach((dependency) => { - if (dependency) { - const file = parseFile(dependency) - result.push(file) - } - }) - } - return result -} -function generatelocalName (importFile) { - return `__${importFile.split(path.sep).join('_')}` -} -let result = parseFiles(config.entry) -console.log(result[0].code) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5a2fec5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,290 @@ +{ + "name": "au-webpack", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.1.tgz", + "integrity": "sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.1.tgz", + "integrity": "sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.0.tgz", + "integrity": "sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.0", + "@babel/types": "^7.14.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.1.tgz", + "integrity": "sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "dev": true, + "requires": { + "jake": "^10.6.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dev": true, + "requires": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } +} diff --git a/package.json b/package.json index f2cedf2..e45e0d2 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,23 @@ { - "name": "ast", + "name": "mini-webpack", "version": "1.0.0", "description": "", "main": "index.js", + "bin": { + "acli": "./bin/acli.js" + }, "scripts": { - "build": "webpack --config webpack.config.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", - "dependencies": { - "@babel/core": "^7.12.17", - "@babel/generator": "^7.12.17", - "@babel/parser": "^7.12.17", - "@babel/traverse": "^7.12.17", - "@babel/types": "^7.12.17", - "babel": "^6.23.0", - "uuid": "^8.3.2" - }, "devDependencies": { - "webpack-cli": "^4.5.0", - "webpack": "^5.23.0" + "@babel/generator": "^7.14.1", + "@babel/parser": "^7.14.1", + "@babel/traverse": "^7.14.0", + "ejs": "^3.1.6" + }, + "dependencies": { + "tapable": "^2.2.0" } } diff --git a/src/add.js b/src/add.js deleted file mode 100644 index 7731dda..0000000 --- a/src/add.js +++ /dev/null @@ -1,3 +0,0 @@ -export function add(a, b) { - return a + b -} \ No newline at end of file diff --git a/src/sub.js b/src/sub.js deleted file mode 100644 index 625c16a..0000000 --- a/src/sub.js +++ /dev/null @@ -1,4 +0,0 @@ -export function sub(a, b) { - return a - b -} -export let subName = '这是减法名称' \ No newline at end of file diff --git a/src/test.js b/src/test.js deleted file mode 100644 index ddff87c..0000000 --- a/src/test.js +++ /dev/null @@ -1,7 +0,0 @@ -import { add } from './add' - -console.log(add(10, 22)) - -export default function helloworld(name) { - console.log('hello world' + name) -} \ No newline at end of file diff --git a/template/index.ejs b/template/index.ejs new file mode 100644 index 0000000..5c46cb9 --- /dev/null +++ b/template/index.ejs @@ -0,0 +1,26 @@ + +(() => { // webpackBootstrap + var __webpack_modules__ = ({ + <%for (let key in modules) {%> + "<%- key%>": + ((module, exports, __webpack_require__) => { + eval(`<%- modules[key]%>`); + }), + <%}%> + }); + + var __webpack_module_cache__ = {}; + + function __webpack_require__ (moduleId) { + var cachedModule = __webpack_module_cache__[moduleId]; + if (cachedModule !== undefined) { + return cachedModule.exports; + } + var module = __webpack_module_cache__[moduleId] = { + exports: {} + }; + __webpack_modules__[moduleId](module, module.exports, __webpack_require__); + return module.exports; + } + var __webpack_exports__ = __webpack_require__(`<%- entryPath%>`); +})(); \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 9369653..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,9 +0,0 @@ -const path = require('path') -module.exports = { - entry: './index.js', - output: { - filename: 'bundle.js', - path: path.resolve(__dirname, 'dist') - }, - mode: 'development' -} \ No newline at end of file From f1856e38c8035763b52061fa113ba0bdcd209258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=AA=89?= <974257574@qq.com> Date: Sat, 17 Jul 2021 15:09:29 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..3998aa9 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# 使用 + +* `npm install` 或 `yarn` +* `npm link`,之后就将 `acli` 命令注册到了全局 + +1. 准备一个新项目,将原来的 `webpack` 命令改成 `acli` 就能完成 `mini-webpack` 的构建功能 +2. 需提供一个 `webpack.config.js` 配置文件 +3. `acli` 默认读取的是 `process.cwd()` 下的 `webpack.config.js` 配置文件 \ No newline at end of file