《webpack的正常操作》

122 阅读4分钟

什么是webpack?

webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具,说白了就是前端项目工程化的具体解决方案

功能:

  1. 将一个或多个 JS 文件打包成对应的文件;
  2. 将一个或多个 CSS 文件打包成对应的文件;
  3. 压缩代码,转译代码,构建build,代码分析;
  4. 处理游览器javaScript的兼容性,性能优化。

好处: 提高了前端开发效率和项目的可维护性。

纠正踩坑操作

基本安装

首先我们创建一个项目,初始化 npm,接着安装 webpack-cli,生成package.json配置文件

npm init -y
yarn add webpack webpack-cli -dev

安装 JQuery npm install jquery -S

  • es6 模块化导入 jquery

现在,我们将创建以下目录结构、文件:

|- /src
+   |- index.js
+   |- x.js

接下来 webpack 打包一下

npx webpack

生成dist文件,由于我们每次运行npx webpack时候会产生新的dist文件,我们可以在package.json里配置新命令: "build": "rm -rf dist && webpack这样每次执行都会删除旧的,在生成新的。

build": "rm -rf dist && webpack

现在,我们将创建以下目录结构、文件:

|- /assets
+   |- index.html
|- /src
+   |- index.js
+   |- x.js
+   |- x.css
使用一个配置文件webpack.config.js 需要新建

webpack的配置文件,webpack在真正开始打包之前,会先读取webpack.config.js,根据里面的配置对项目进行打包。

  • 通过 require(...) 引入其他文件
  • 通过 require(...) 使用 npm 下载的工具函数
  • 使用 JavaScript 控制流表达式,例如 ?: 操作符
  • 对 value 使用常量或变量赋值
  • 编写并执行函数,生成部分配置 webpack.config.js
module.exports = {
  mode: 'development',
}

package.json

"scripts": {
  "dev": "webpack",//通过npm run dev执行
},

了解一下mode

mode 节点的可选值有两个,分别是:

① development

  • 开发环境
  • 不会对打包生成的文件进行代码压缩和性能优化 
  • 打包速度快,适合在开发阶段使用

② production

  • 生产环境
  • 不会对打包生成的文件进行代码压缩和性能优化 
  • 所有代码最小化,没有任何注释,给用户使用
  • 打包速度很慢,仅适合在项目发布阶段使用

了解entry与output

webpack中有两个默认约定:默认打包入口文件src/index.js,默认输出文件路径:dist/main.js;

下面可以修改默认约定:

在webpack.config.js配置文件中,通过entry节点指定文件打包的入口(路径),指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始;

通过output节点指定文件打包的出口,指示webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist

const path = require('path')

module..exports={
    mode:"development",
    entry: path.join(__dirname','./src/index.js'),
    //__dirname:第一个参数,当前文件所处的那层目录
    output: {
      //path:patn.join(__dirname,'./dist'),默认导出地址可以不写
      filename: 'bundle.js',
    },
}

contenthash的作用

用于http添加缓存,生成在dist里文件名可以随时更新,这个协议是http响应头中cache-control webpack.config.js

const path = require('path');

module.exports = {
    mode: 'development',
   entry: './src/index.js',
    output: {
      filename: 'index.[contenthash].js'
    },
};

了解loader插件(plugins)

loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)

插件(plugins)想要使用一个插件,你只需要 require() 它,然后把它添加到 plugins 数组中。多数插件可以通过选项(option)自定义。你也可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用 new 操作符来创建它的一个实例。

x.js引入x.css ,index.js引入x.js

x.js的内容
import './x.css'
export default 'xxx';
index.js内容
import x from './x.js'

引入CSS (css-loader)

首先,你需要先安装 css-loader

yarn add style-loader --dev
yarn add css-loader  --dev

webpack.config.js

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/i,
          use: ["style-loader", "css-loader"],
      },
    ],
  },
}

引入html (HtmlWebpackPlugin)

安装

yarn add html-webpack-plugin --dev

webpack.config.js

  plugins: [
      new HtmlWebpackPlugin({
        title: 'xdml-web前端',
        template: 'src/assets/index.html'
      }),
      
    ],

当我直接yarn start 运行报错,index.js 页面404,在服务器上加载不出来,于是我查资料看到# webpack-dev-server 可以快速开发,并不会生成dist

安装

yarn add webpack-dev-server --dev

webpack.config.js

mode: 'development'

修改配置文件,告知 dev server,从什么位置查找文件:

devtool: 'inline-source-map',
devServer: {
+    static: './dist',
+  },

我们添加一个可以直接运行 dev server 的 script:

"start": "webpack serve --open",

把CSS抽成文件 mini-css-extract-plugin

安装

yarn add -D mini-css-extract-plugin

webpack.config.js

const MiniCssExtractPlugin = require("mini-css-extract-plugin");
plugins: [
    new MiniCssExtractPlugin({
      filename: "[name].[contenthash].css",
      chunkFilename: "[id].[contenthash].css",
    }),
  ],
use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              publicPath: "../",
            },
          },
          "css-loader",
        ],

可以将开发模式和生产模式同时配置,这样我们就不用切换

  • 开发模式 webpack.config.js
mode: 'development'

引入CSS (css-loader)

  • 生产模式webpack.config.js
mode: 'production'

把CSS抽成文件 mini-css-extract-plugin,可以在自动生成文件名和后缀

引入SCSS

yarn add sass-loader dart-sass --dev