杨梵
侠客
侠客
  • UID477
  • 粉丝0
  • 关注0
  • 发帖数12
阅读:4994回复:0

前端需掌握的技能—Webpack

楼主#
更多 发布于:2019-06-21 18:25
一、为什么需要掌握webpack。
由于平台编辑会出现很多乱码和图片顺序乱问题,所以补充了一个worl版本 webpack.docx  

当我们写es6scassless的时候需要用它来转换打包;可以使用热替换来开发,保存代码浏览器自动刷新;可以嵌入eslint来验证前端代码规范,就可以避免代码难维护,下个人接手更容易读懂代码;在使用reactvue的时候也必须使用到webpack;我在使用vue-cli的时候常常遇到一些配置报错,就导致无从下手,如下图。

图片:)D`6W6EEXKXY6}{LEW]I%3F.png


问题在于在装vuex的时候报错,我又重新装了一次显示成功,但是在我重启项目的时候项目报错。

图片:$$5VA~Q4_YK[~]48U{`[JW0.png


解决了好久都没解决,因为不熟悉webpack,就只能重新删除node的配置,重新的npm install下载一遍才得以正常运行。
二、什么是webpack。
就不使用官方语言,因为新入手的人比较难以理解,首先看图。

图片:6W(6Z72Y@HMVJ1{2ALLNEE1.png


 图里面各种jspng交叉,在业务中我们正常写js的时候需要依赖其他的js文件,其他的js文件可能去依赖资源文件(png图片、lessscss),最终把这些文件合并打包的时候就是webpack需要做的。它会自动分析js文件引入了那些文件进行组织,然后把相同格式文件打包成一个。

三、webpack的安装。
Webpack4是需要node.js9以上,所以需要使用命令node -v查看本机的node版本,如果低于请升级。
3.1 使用npm install webpack-cli -g进行全局安装。
3.2 打包测试
新建二个js文件,一个是index.js,一个是test_moud.js
index.js引用 test_moud.js,然后执行打包命令 webpack index.js -o index_test.js
Index_test.js是生成之后的文件名称。

图片:1.png


如果命名不带modewebpack默认生成production下的文件(生产模式,用于项目上线,文件体积小,能过滤不必要代码,如console.logalert等),假设需要生成development环境需要加mode(开发模式,多用于开发,文件体积大,开发可以debug查看错误日志等功能)。
Mode的命令 webpack --mode development index.js -o index_test_development.js 打包成开发模式。
3.3 0cjs

0cjs的意思是0配置,webpack4不会像以前版本那样需要webpack.config.js打包入口文件,它的默认入口为./src和默认出口./dist
新建一个src文件夹,把js拷贝进去,执行打包代码,自动生成一个dist文件夹,里面存在打包好的js。执行webpack --mode development快捷打包。

图片:2.png



生成的文件main.jsindex_tes一样,只实用小项目,不需要配置文件的。
四、配置文件的入口和出口
4.1新建一个webpack.config.js文件。

图片:3.png


新建一个input.js文件作为入口文件,执行webpack打包生成dist文件夹及其文件夹下的output.bundle.js文件。
4.2 打包多个文件。
4.1只能打包一个js文件,enty提供打包多个文件。重新新建三个js文件,在config里面配置三个文件信息,然后执行打包,如下图。

图片:4.png


默认是生产模式,如果需要打包开发模式只需要配置mode类型以下是配置代码。

module.exports = {
entry: {
home: './home.js',
about: './about.js',
other: './other.js'
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].bundle.js'
},
mode: 'development'
};

五、加载url_loader

当文件大小小于某个指定的size之后,转换为dataUrl形式。
 为什么要使用它呢?因为网站存在很多图片,如果网站每张图片都需要加载就会导致网站性能差,过去采用雪碧图,但是雪碧图的扩展不好,而url_loader能把图片打包到js或者css文件,图片就不是以物理形式存在,而是base64的形式存在某个文件中。
5.1 首先执行 npm init -y 生成package.json文件。
5.2 执行 npm install url-loader -S url-loader全局安装。
5.3 执行 npm install file-loader -S,如不执行这步webpack报错,它是处理文件的依赖。
5.4 配置以下文件

module: {
    rules: [
      {
        test: /\.(png|jpg|gif)$/i, //编译的图片格式
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 8192, //小于8kb的图片才会被编译
            },
          },
        ],
      },
    ],
  }
  }


5.5 js文件引入图片之后,执行打包,系统就把小于8kb的图片打包进入js文件之中。六、babel-loader
Es6es7本身对浏览器兼容不好,而babel-laoder能把es6es7转换为es5,很常用。
6.1 首先安装


npm install -D babel-loader @babel/core @babel/preset-env webpack


6.2 js配置文件写入


module: {
  rules: [
    {
      test: /\.m?js$/, //编译的文件格式
      exclude: /(node_modules|bower_components)/, //需要排除的文件格式
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env'], //支持的规则
           plugins: ['@babel/plugin-proposal-object-rest-spread'] //可以填写react、vue、ang就可以支持三大框架

        }
      }
    }
  ]}


6.3 写一段es6的代码,执行打包,就已经转换为es5文件。

七、scass-loader
处理scasscss文件。
7.1 安装npm install sass-loader node-sass -Dnpm install css-loader style-loader -D
同时还得装cnpm install color-name -D  不然打包时会报错。

7.2 写入以下规则


rules: [{
            test: /\.scss$/,
            use: [
                "style-loader", // creates style nodes from JS strings
                "css-loader", // translates CSS into CommonJS
                "sass-loader" // compiles Sass to CSS, using Node Sass by default
            ]
        }]

7.3 在目录下面新建一个scss文件,写入一些样式,然后执行打包,把scss打包进入到js文件里。

八、MiniCssExtractPlugin

它的作用也是打包css,不过是单独把scss处理到css文件里,而不是打包到js文件,这样更好,因为打包到js导致多了css代码,不利于debug
8.1 安装 cnpm install mini-css-extract-plugin -D
8.2在配置文件引入


const MiniCssExtractPlugin = require('mini-css-extract-plugin');


在和modul同级的地方写入规则

plugins: [
new MiniCssExtractPlugin({
// Options similar to the same options in webpackOptions.output
// both options are optional
filename: '[name].css',
chunkFilename: '[id].css',
}),
],


改下rules的配置规则


rules: [{
test: /\.scss$/,
use: [
MiniCssExtractPlugin.loader, //默认的使用插件打包
"css-loader", // translates CSS into CommonJS
"sass-loader" // compiles Sass to CSS, using Node Sass by default
]
}]



九、DefinePlugin



这个功能主要配置开发环境和生产环境的接口地址变量,因为在开发的时候使用的地址和上线的地址使用不一样,
在里面配置好地址,整个项目都可以引用。
9.1 先引入webpack  


const webpack = require('webpack')


在配置


plugins: [
new webpack.DefinePlugin({
'SERVICE_URL': JSON.stringify('https://dev.example.com')
})
],


然后在入口js文件可以写一个测试文件


async function sayHello() {
const result = await fetch(SERVICE_URL);
console.log(result);
}
sayHello();


执行打包。进入打包好的文件查询就可以查询到对应的全局地址。

十、HtmlWebpackPlugin



协助生成HTML文件。
10.1 安装cnpm install html-webpack-plugin -D


引入const HtmlWebpackPlugin = require('html-webpack-plugin');
在规则在配置 new HtmlWebpackPlugin()


10.2执行打包,自动生成一个html文件。同时自动的引入了cssjs,如下图



10.2 自定义的html
配置文件写入


new HtmlWebpackPlugin(
{
title: 'My App', //标题
filename: 'admin.html', //输出的html
template: 'test.html' //引入的文件  //引入的html
}


新建一个test文件。里面写入自定义的html内容,执行打包生成一个admin.html的文件。

十一、DevServer 热替换
启动服务,能实现热替换,作用就是每次保存代码浏览器会自动刷新页面
11.1安装 cnpm install webpack-dev-server -D 然后在本地安装webpack npm install webpack如果不安装本地的webpack启动热替换会报错,我的出现了。
11.2 打开package.json 配置


"scripts": {
"start": "webpack-dev-server --open"
},


11.3打开webpack.config.js分别配置


devServer: {
contentBase: path.join(__dirname, 'dist'),
compress: true, //是否压缩
port: 9000//端口
},
plugins: [
new webpack.HotModuleReplacementPlugin() //热更替
],


11.4 启动 npm run start 启动成功之后打开端口文件,实现了浏览器自动筛新的功能。


以上的配置都是在开发中常用的配置,当然还有很多配置没涉及,不常用的需要自己下去探索。
[杨梵于2019-07-24 17:44编辑了帖子]
游客

返回顶部