关于webpack问答记录...

Question

谈谈你对webpack的见解

webpack是一个模块打包工具,可使用它管理项目中的模块依赖,并编译输出模块所需的静态文件。它能够很好地管理、打包开发中所用到的HTML,CSS,JavaScript和静态文件(图片,字体)等,让开发更高效。对于不一样类型的依赖,webpack有对应的模块加载器,并且会分析模块间的依赖关系,最后合并生成优化的静态资源。css

webpack的基本功能和工做原理?

一、代码转换:TypeScript 编译成 JavaScript、SCSS 编译成 CSS 等等html

二、文件优化:压缩 JavaScript、CSS、HTML 代码,压缩合并图片等前端

三、代码分割:提取多个页面的公共代码、提取首屏不须要执行部分的代码让其异步加载vue

四、模块合并:在采用模块化的项目有不少模块和文件,须要构建功能把模块分类合并成一个文件node

五、自动刷新:监听本地源代码的变化,自动构建,刷新浏览器webpack

六、代码校验:在代码被提交到仓库前须要检测代码是否符合规范,以及单元测试是否经过web

七、自动发布:更新完代码后,自动构建出线上发布代码并传输给发布系统。vue-cli

webpack打包原理

一、把一切都视为模块:不论是 CSS、JS、Image 仍是 HTML 均可以互相引用,经过定义 entry.js,对全部依赖的文件进行跟踪,将各个模块经过 loader 和 plugins 处理,而后打包在一块儿。shell

二、按需加载:打包过程当中 Webpack 经过 Code Splitting 功能将文件分为多个 chunks,还能够将重复的部分单独提取出来做为 commonChunk,从而实现按需加载。把全部依赖打包成一个 bundle.js 文件,经过代码分割成单元片断并按需加载npm

三、webpack.config.js的配置

// webpack的配置文件 因为webpack是基于Node构建的,webpack配置文件中全部的合法node语法均可以用
var path = require('path')
// 若是要配置插件,须要在导出的对象上添加plugins节点
var htmlWebpackPlugin = require('html-webpack-plugin')
// 配置导出对象
module.exports = {
    // 入口文件
    entry: path.join(__dirname, './src/main.js'),
    /* // 入口文件的配置项,配置两个 entry:{ entry:'./src/entry.js', //这里咱们又引入了一个入口文件 entry2:'./src/entry2.js' }, */
    // 指定输出选项
    output: {
        path: path.join(__dirname, './dist'), // 指定输出路径
        /* path:path.resolve(__dirname,'dist'), // 输出的路径,用了Node语法 */
        filename: 'bundle.js' // 指定输出文件的名字
    },
    // 插件对象节点
    plugins: [
        new htmlWebpackPlugin({
            template: path.join(__dirname, './src/index.html'), // 指定模板文件路径
            filename: 'index.html' // 设置生成内存页面的的名字
        }),
    ],
    // 配置全部第三方loader(载入程序)模块 例如解读CSS,图片如何转换,压缩
    module: {
        // 第三方模块的匹配规则
        rules: [
            // 这里的test于正则的test同样
            // 处理css文件的loader
            {test: /\.(css|scss)$/, use: ['style-loader', 'css-loader', 'sass-loader']},
            // 处理图片路径的loader 这里的limit为图片的大小(单位是字节)
            {test: /\.(jpg|png|gif|jpeg|bmp)$/, use: 'url-loader?limit=349950&name=[hash:8]-[name].[ext]'},
            // 处理字体图标的loader
            {test: /\.(ttf|eot|svg|woff|woff2)$/, use: 'url-loader'},
            // 把Es6的高级语法转换成浏览器能够识别的低级语言
            {test: /\.js$/, use: 'babel-loader', exclude: /node_modules/},
            // 处理vue文件的loader
            {test: /\.vue$/, use: 'vue-loader'}
        ]
    },
    // 配置导入包的路径
    /*  resolve : {         alias : { // alias别名 修改vue导入的路径             "vue$" : "vue/dist/vue.js"         }     }*/
}
复制代码

webpack的优点

(1) webpack 是以 commonJS 的形式来书写脚本的,但对 AMD/CMD 的支持也很全面,方便旧项目进行代码迁移。

(2)能被模块化的不只仅是 JS 了。

(3) 开发便捷,能替代部分 grunt/gulp 的工做,好比打包、压缩混淆、图片转base64等。

(4)扩展性强,插件机制完善

webpack的核心概念

Entry:入口,Webpack 执行构建的第一步将从 Entry 开始,可抽象成输入。告诉webpack要使用哪一个模块做为构建项目的起点,默认为./src/index.js

output :出口,告诉webpack在哪里输出它打包好的代码以及如何命名,默认为./dist

Module:模块,在 Webpack 里一切皆模块,一个模块对应着一个文件。Webpack 会从配置的 Entry 开始递归找出全部依赖的模块。

Chunk:代码块,一个 Chunk 由多个模块组合而成,用于代码合并与分割。

Loader:模块转换器,用于把模块原内容按照需求转换成新内容。

Plugin:扩展插件,在 Webpack 构建流程中的特定时机会广播出对应的事件,插件能够监听这些事件的发生,在特定时机作对应的事情。

什么是loader,什么是plugin

loader用于加载某些资源文件。由于webpack自己只能打包common.js规范的js文件,对于其余资源如css,img等,是没有办法加载的,这时就须要对应的loader将资源转化,从而进行加载。使wenbpack拥有加载和解析非js文件的能力   常见的loader以及做用 一、file-loader:把文件输出到一个文件夹中,在代码中经过相对 URL 去引用输出的文件 二、url-loader:和 file-loader 相似,可是能在文件很小的状况下以 base64 的方式把文件内容注入到代码中去 三、source-map-loader:加载额外的 Source Map 文件,以方便断点调试 四、image-loader:加载而且压缩图片文件 五、babel-loader:把 ES6 转换成 ES5 六、css-loader:加载 CSS,支持模块化、压缩、文件导入等特性 七、style-loader:把 CSS 代码注入到 JavaScript 中,经过 DOM 操做去加载 CSS。 八、eslint-loader:经过 ESLint 检查 JavaScript 代码

plugin用于扩展webpack的功能。不一样于loader,plugin的功能更加丰富,好比压缩打包,优化,不仅局限于资源的加载。

一、UglifyJsPlugin: 压缩代码 二、HotModuleReplacementPlugin 自动刷新 三、HtmlWebpackPlugin 依据一个简单的index.html模版,生成一个自动引用你打包后的js文件的新index.html 四、ExtractTextWebpackPlugin 它会将入口中引用css文件,都打包都独立的css文件中,而不是内嵌在js打包文件中 五、Tree-shaking 指在打包中去除那些引入了,可是在代码中没有被用到的那些死代码 六、在webpack中Tree-shaking是经过uglifySPlugin来Tree-shaking,Css须要使用Purify-CSS

常见的plugin以及做用

define-plugin:定义环境变量 commons-chunk-plugin:提取公共代码 uglifyjs-webpack-plugin:经过UglifyES压缩ES6代码

什么是bundle,什么是chunk,什么是module

bundle:是由webpack打包出来的文件

chunk:是指webpack在进行模块依赖分析的时候,代码分割出来的代码块

module:是开发中的单个模块

webpack 和 gulp 的区别?

webpack是一个模块打包器,强调的是一个前端模块化方案,更侧重模块打包,咱们能够把开发中的全部资源都当作是模块,经过loader和plugin对资源进行处理。

gulp是一个前端自动化构建工具,强调的是前端开发的工做流程,能够经过配置一系列的task,第一task处理的事情(如代码压缩,合并,编译以及浏览器实时更新等)。而后定义这些执行顺序,来让glup执行这些task,从而构建项目的整个开发流程。自动化构建工具并不能把全部的模块打包到一块儿,也不能构建不一样模块之间的依赖关系。

如何自动生成webpack配置文件?

webpack-cli、vue-cli

什么是模热更新?有什么优势?

模块热更新是webpack的一个功能,它可使得代码修改以后,不用刷新浏览器就能够更新。在应用过程当中替换添加删出模块,无需从新加载整个页面,是高级版的自动刷新浏览器。         优势:只更新变动内容,以节省宝贵的开发时间。调整样式更加快速,几乎至关于在浏览器中更改样式

webpack-dev-server 和 http服务器的区别

webpack-dev-server使用内存来存储webpack开发环境下的打包文件,而且可使用模块热更新,比传统的http服务对开发更加有效。

什么是长缓存?在webpack中如何作到长缓存优化?

浏览器在用户访问页面的时候,为了加快加载速度,会对用户访问的静态资源进行存储,可是每一次代码升级或者更新,都须要浏览器去下载新的代码,最方便和最简单的更新方式就是引入新的文件名称。

在webpack中,能够在output给出输出的文件制定chunkhash,而且分离常常更新的代码和框架代码,经过NameModulesPlugin或者HashedModulesPlugin使再次打包文件名不变。

什么是Tree-sharking?

指打包中去除那些引入了但在代码中没用到的死代码。在wepack中js treeshaking经过UglifyJsPlugin来进行,css中经过purify-CSS来进行.

webpack构建流程

  1. 初始化参数,从配置文件和shell语句中读取与合并参数,得出最终的参数

  2. 开始编译:用上一步获得的参数初始化 Compiler 对象,加载全部配置的插件,执行对象的 run 方法开始执行编译;

  3. 肯定入口,经过entry找到入口文件

  4. 编译模块:从入口文件出发,调用全部配置的 Loader 对模块进行翻译(按照loader的规则进行转换),再找出该模块依赖的模块,再递归本步骤直到全部入口依赖的文件都通过了本步骤的处理;

  5. 完成模块编译,获得每一个模块被翻译以后的最终的内容和依赖关系

  6. 输出资源,根据入口和模块之间的依赖关系,组装成一个个包含多个模块的chunk,在把每一个chunk转换成一个单独的文件加载到输出列表,这步是能够修改输出内容的最后机会

  7. 输出完成:在肯定好输出内容后,根据配置肯定输出的路径和文件名,把文件内容写入到文件系统。

  8. 在整个流程中webpack会在恰当的时机执行plugin里定义的逻辑

如何提升webpack的构建速度?

多入口状况下,使用CommonsChunkPlugin来提取公共代码

经过externals配置来提取经常使用库

利用DllPlugin和DllReferencePlugin预编译资源模块 经过DllPlugin来对那些咱们引用可是绝对不会修改的npm包来进行预编译,再经过DllReferencePlugin将预编译的模块加载进来。

使用Happypack 实现多线程加速编译

使用webpack-uglify-parallel来提高uglifyPlugin的压缩速度。 原理上webpack-uglify-parallel采用了多核并行压缩来提高压缩速度

使用Tree-shaking和Scope Hoisting来剔除多余代码

如何利用webpack来优化前端性能

压缩代码。uglifyJsPlugin 压缩js代码, mini-css-extract-plugin 压缩css代码

删除死代码(tree shaking),css须要使用Purify-CSS

提取公共代码。webpack4移除了CommonsChunkPlugin (提取公共代码),用optimization.splitChunks和optimization.runtimeChunk来代替

相关文章
相关标签/搜索