вебпак для компиляцииjavascript
модуль, который может скомпилировать формат файла в желаемый статический формат файла, но процесс обработки не полностью определяетсяwebpack
Совершенный в себе,webpack
Он просто обеспечивает механизм упаковки, и для обработки упаковки различных файлов необходимо использовать соответствующий модуль предварительной обработки.loader
обращаться, как с механизмомwebpack
помогут различныеloader
Обеспечивает идентификацию входных каталогов, входных файлов, выходных каталогов и выходных файлов.
Сначала мы пытаемся упаковать пакет, который содержит толькоconsole.log('hello world')
изjs
документ.
Файлы инициализации и установкаwebpack
окружающая обстановка
# 新建 demo 目录
mkdir webpack-demo cd webpack-demo
# 初始化目录
npm init -y
# 本地安装 webpack 工具
npm install webpack webpacl-cli --save-dev
# webpack 默认的入口文件是 .src/index.js 创建 src 目录和 index.js 文件
mkdir src
echo “console.log('hello world')” > src/index.js
# 执行 webpack 命令 需要查看打包后文件, 这里使用 development 模式
npx webpack --mode development
Упрощенные упакованные файлы
Поскольку упакованные файлы громоздки, здесь мы упрощаем упакованные файлы.
(function(modules) {
var installedModules = {}
function __webpack_require__(moduleIid) {
}
return __webpack_require__(__webpack_require__.s = "./src/index.js")
})({
"./src/index.js": (function(module, exports) {
eval("console.log('test webpack entry')");
})
})
Упакованный файл содержит много комментариев и
webpack
сами переменные, для удобства анализа эти аннотации и подобные__webpack_require__.s
удалить все операторы копирования
Как видно из приведенного выше кода,
- проходить через
webpack
Упакованный код проходитIIFE
Самовыполняющаяся функция, эта функция получает параметр объекта,key
это каталог входного файла,value
это функция, которая выполняет код в файле ввода - этот объект как параметр
modules
Перейти кIIFE
функция -
IIFE
Внутри функции объявлена переменнаяinstalledModules
Используется для хранения кеша, функция__webpack_require__
, используемый для преобразования кода в файле ввода -
IIFE
наконец положитьmodules
внутриkey
Перейти к__webpack_require__
функция и возврат.
мы смотрим дальше__webpack_require__
что делает функция.
__webpack_require__
анализировать
function (modules) {
var installedModules = {}
function __webpack_require__ (moduleId) {
if(installedModules[moduleId]) {
return installedModules[moduleId].exports
}
var module = installedModules[moduleId] = {
i: moduleId,
l:false,
exports: {}
}
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)
module.l = true
return module.exports
}
}
-
__webpack_require__
функция получения./src/index.js
- Сначала проверьте кеш
installedModules
содержит ли онkey
для./src/index.js
объект, если он существует, вернуть объект в этот объект напрямуюexports
- Когда модуль входа не существует в кеше, в кеше создается и помещается в кеш объект, который включает три значения:
i
l
exports
- использовать
modules[moduleId].call
передачаIIFE
параметрическийvalue
функцию и поставитьvalue
В соответствующей функцииthis
указатель, назначенныйmodule.exports
, Назадcall
Последние три параметра методаvalue
Параметры соответствующей функции - наконец вернулся
module.exports
, здесьmodule.exports
На четвертом этапе он был назначен какIIFE
в объекте параметраvalue
соответствующую функцию.
Так что это видно. функция__webpack_require__
То, что на самом деле возвращается,IIFE
в объекте параметраvalue
Соответствующая функция, т.eval("\nconsole.log('test webpack entry')\n\n\n//# sourceURL=webpack:///./src/index.js?")
,
когда мы бежимwebpack
Когда упакованный файл выполняется, он выполняется"console.log('test webpack entry')"
Функция eval() оценивает строку и выполняет в ней код JavaScript.
Процесс упаковки, когда файл записи ссылается на другие модули
Никакие другие модули кода не упоминаются в файле записи процесса упаковки, упомянутом выше.webpack
Процесс упаковки также аналогичен описанному выше процессу.
существует./src/
под новымmain.js
module.exports = () => {
console.log('main module')
}
существует./src/index.js
введен вmain.js
const main = reuiqre('./main.js')
console.log('webpack index entry')
main()
бегатьnpx webpack
упакованный файл
IIFE
изменение параметра
(function (mudoles) {
})({
'./src/index.js': (function(module,exports, __webpack_require__) {
eval("const main = __webpack_require__(/*! ./main.js */ \"./src/main.js\")\r\nconsole.log('test webpack entry')\r\n\n\n//# sourceURL=webpack:///./src/index.js?");
}),
'./src/main.js': (function(module, exports) {
eval("console.log('main module')\n\n//# sourceURL=webpack:///./src/main.js?");
})
})
Если в файле записи есть ссылки на файлы из других модулей, эти модули будут добавлены вIIFE
в объекте параметра ,key
путь модуля,value
Функция, которая выполняет код этого модуля.
IIFE
Изменения в логике выполнения функций
function (modules) {
var installedModules = {}
function __webpack_require__ (moduleId) {
if (installedModules[moduleId]) {
return installedMOdules[mudoleId].exports
}
var module = installedModuled[moduleId] = {
i: moduleId,
l: false,
exports: {}
}
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)
return module.exports
}
return __webpack_require__(__webpack_require__.s = "./src/index.js")
}
Приведенный выше код по-прежнему возвращает./src/index.js
функция с параметрами. Но логика внутри функции изменилась.
- объявить один
installedModules
кеш хранения переменных - Буду
./src/index.js
входящий__webpack_require__
функция -
./src/index.js
Нет в кеше, спуститесь - объявить один
module
и сохранить в кеше./src/index.js
дляkey
Объект - передача
modules[moduleId]
функции и указать область и параметры, которыеfunction(module,exports, __webpack_require__) { eval("const main = __webpack_require__(/*! ./main.js */ \"./src/main.js\")\r\nconsole.log('test webpack entry')\r\n\n\n//# sourceURL=webpack:///./src/index.js?")}
- вернуть
module.exports
, так как пятый шаг вызываетmodules['./src/index.js']
функция, уже поставилmodule.exports
как функцияthis
размах, так что на этот разmodule.exports
фактическиmodules['./src/index.js']
функция для выполнения. - В приведенной выше функции
eval
В коде используется функция__webpack_require__
, эта функция находится на пятом шагеmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__)
последний параметр__webpack_require__
, затем продолжайте звонить__webpack__require__
функционировать и проходить в./src/main.js
-
./src/main.js
входящий__webpack_require__
, все еще не в кеше, снова объявить переменнуюmodule
и добавить новый в кешkey
для./src/main.js
Объект. -
modules[moduleId].call
позвони в это времяIIFE
объект параметраkey
для./src/main.js
Функция:(function(module, exports) { eval("console.log('main module')\n\n//# sourceURL=webpack:///./src/main.js?"); })
- вернуть
module.export
, аналогично шагу 6 в настоящее времяmodule.exports
то естьmodules[./src/main.js]
соответствующую функцию. - Окончательный возвращаемый результат (удален
eval
и комментарии):
const main = console.log('main module')
console.log(test webpack entry)