浅谈webpack编译vue项目生成的代码探索(4)
6号模块
和 App.vue 的解析有关,把 App.vue 中的 template 和 script 编译为一个 vue components,并把 style 标签内的样式插入到DOM中。
/* 6 */ /***/ (function (module, __webpack_exports__, __webpack_require__) { "use strict"; // 返回具体 App.vue 中 的script 中的代码 var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__ = __webpack_require__(13); // 把App.vue 的 template 解析为一堆 vue render 函数。 var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_66ce2159_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__ = __webpack_require__(14); // 注入vue文件里写入的css函数 function injectStyle(ssrContext) { // 由此可知7号模块是编译并插入vue中的css到DOM上的 __webpack_require__(7) } // 12号模块用于输出components渲染函数 var normalizeComponent = __webpack_require__(12) /* script */ /* template */ /* template functional */ var __vue_template_functional__ = false /* styles */ var __vue_styles__ = injectStyle /* scopeId */ var __vue_scopeId__ = null /* moduleIdentifier (server only) */ var __vue_module_identifier__ = null // 编译模块,混杂template和script。 var Component = normalizeComponent( __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__["a" /* default */ ], __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_66ce2159_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__["a" /* default */ ], __vue_template_functional__, __vue_styles__, __vue_scopeId__, __vue_module_identifier__ ) /* harmony default export */ __webpack_exports__["a"] = (Component.exports); /***/ }),
7、8、9、10、11
都和样式有关,简言之就是7号模块加载8号模块获取css代码作为参数,并作为参数传入10号模块进行插入
太长也只大意上列出结构
- 7号模块由 style-loader 带入,把所有的css插入到 style 标签里
- 8号模块加载具体的css代码,
- 9号模块由css-loader代入,用于做css的sourceMap
- 10号模块返回具体插入动作函数,供7号模块调用
- 11号模块把所有的样式组成的数组转为字符串,给10号模块做插入。
/* 7 */ /***/ (function (module, exports, __webpack_require__) { // style-loader: Adds some css to the DOM by adding a <style> tag // load the styles var content = __webpack_require__(8); if (typeof content === 'string') content = [ [module.i, content, ''] ]; if (content.locals) module.exports = content.locals; // add the styles to the DOM var update = __webpack_require__(10)("15459d21", content, true); /***/ }), /* 8 */ /***/ (function (module, exports, __webpack_require__) { // css-loader 用于做css的sourceMap exports = module.exports = __webpack_require__(9)(undefined); // imports // module // 这就是 App.vue 文件中 style 里的的 css exports.push([module.i, "#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#2c3e50;margin-top:60px}h1,h2{font-weight:400}ul{list-style-type:none;padding:0}li{display:inline-block;margin:0 10px}a{color:#42b983}", ""]); // exports /***/ }), /* 9 */ /***/ (function (module, exports) { // css base code, injected by the css-loader module.exports = function (useSourceMap) { // 省略代码... } }), /* 10 */ /***/ (function (module, exports, __webpack_require__) { /* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra Modified by Evan You @yyx990803 */ // ...太长只贴了关键步骤,总之关键的函数就是这些 var hasDocument = typeof document !== 'undefined' // ... var listToStyles = __webpack_require__(11) // ... var head = hasDocument && (document.head || document.getElementsByTagName('head')[0]) // ... module.exports = function (parentId, list, _isProduction) { // ... var styles = listToStyles(parentId, list) addStylesToDom(styles) return function update (newList) { // ... } } function addStylesToDom (styles /* Array<StyleObject> */) { for (var i = 0; i < styles.length; i++) { // ... domStyle.parts.push(addStyle(item.parts[j])) // .... } } // 总之先调用了addStylesToDom,接着是addStyle,再是createStyleElement插入样式到head中。 function createStyleElement () { var styleElement = document.createElement('style') styleElement.type = 'text/css' head.appendChild(styleElement) return styleElement } function addStyle (obj /* StyleObjectPart */) { // ... styleElement = createStyleElement() // ... } /***/ }), /* 11 */ /***/ (function (module, exports) { /** * Translates the list format produced by css-loader into something * easier to manipulate. */ module.exports = function listToStyles(parentId, list) { var styles = [] var newStyles = {} for (var i = 0; i < list.length; i++) { var item = list[i] var id = item[0] var css = item[1] var media = item[2] var sourceMap = item[3] var part = { id: parentId + ':' + i, css: css, media: media, sourceMap: sourceMap } if (!newStyles[id]) { styles.push(newStyles[id] = { id: id, parts: [part] }) } else { newStyles[id].parts.push(part) } } return styles } /***/ }),
内容版权声明:除非注明,否则皆为本站原创文章。