初识webpack(一)

224 阅读2分钟

闲来无事,摸起鱼来,感叹时间过得的真慢,还有4个小时才下班呢!再看眼身份证,我都18了,老大不小滴,抓紧干点啥吧,老铁们,最近市场行情怎么样式,欢迎留言

一.初始webpack

1.首先创建项目,这里用npm或者yarn或者pnpm都可以

mkdir webpack-demo

cd webpack-demo

npm init -y

npm install webpack webpack-cli --save-dev
或者
yarn add webpack webpack-cli lodash --save-dev

2.创建project,项目目录如下

  webpack-demo
  |- package.json
  |- package-lock.json
+ |- webpack.config.js
  |- /dist
    |- index.html
  |- /src
    |- index.js

3.webpack.config.js配置(如果 webpack.config.js 存在,则 webpack 命令将默认选择使用它)

const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist'),
  },
};

4.入口文件配置src/index.js

import _ from 'lodash';

 function component() {
   const element = document.createElement('div');

   element.innerHTML = _.join(['Hello', 'webpack'], ' ');

   return element;
 }

 document.body.appendChild(component());

5.dist/index.html配置

 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf-8" />
     <title>起步</title>
   </head>
   <body>
    <script src="main.js"></script>
   </body>
 </html>

6.项目package.json管理,同时增加script脚本

 {
   "name": "webpack-demo",
   "version": "1.0.0",
   "description": "",
   "private": true,
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1",
     "build":"webpack"
   },
   "keywords": [],
   "author": "",
   "license": "MIT",
   "devDependencies": {
     "webpack": "^5.38.1",
     "webpack-cli": "^4.7.2"
   }
 }

至此,我们就可以通过刚才配置的命令执行,npm run build或yarn build来打包项目,

二.资源管理

1.重新引入script

 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf-8" />
    <title>管理资源</title>
   </head>
   <body>
    <script src="bundle.js"></script>
   </body>
 </html>

2.加载css

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

3.修改webpack.config.js打包输出文件名并加入css打包规则

const path = require('path');module.exports = {  entry: './src/index.js',  output: {    filename: 'bundle.js',    path: path.resolve(__dirname, 'dist'),  }, module: {   rules: [     {       test: /\.css$/i,       use: ['style-loader', 'css-loader'],     },   ], },};

4.src/style.css

.hello{    color: blue;}

5.src/index.html

import _ from 'lodash';import './style.css';function component() {    const element = document.createElement('div');    // lodash 现在使用 import 引入    element.innerHTML = _.join(['Hello', 'webpack'], ' ');    element.classList.add('hello');    return element;}document.body.appendChild(component());

注意:module loader 可以链式调用。链中的每个 loader 都将对资源进行转换,不过链会逆序执行。第一个 loader 将其结果(被转换后的资源)传递给下一个 loader,依此类推。最后,webpack 期望链中的最后的 loader 返回 JavaScript。

6.当然,其实webpack也提供了处理静态文件的loader

webpack.config.js

 const path = require('path');

 module.exports = {
   entry: './src/index.js',
   output: {
     filename: 'bundle.js',
     path: path.resolve(__dirname, 'dist'),
   },
   module: {
     rules: [
       {
         test: /\.css$/i,
         use: ['style-loader', 'css-loader'],
       },
+      {
+        test: /\.(png|svg|jpg|jpeg|gif)$/i,
+        type: 'asset/resource',
+      },
     ],
   },
 };

7.同时也可以加载字体,当有字体文件引入之后

webpack.config.js

 const path = require('path');

 module.exports = {
   entry: './src/index.js',
   output: {
     filename: 'bundle.js',
     path: path.resolve(__dirname, 'dist'),
   },
   module: {
     rules: [
       {
         test: /\.css$/i,
         use: ['style-loader', 'css-loader'],
       },
       {
         test: /\.(png|svg|jpg|jpeg|gif)$/i,
         type: 'asset/resource',
       },
+      {
+        test: /\.(woff|woff2|eot|ttf|otf)$/i,
+        type: 'asset/resource',
+      },
     ],
   },
 };

8.同时也可以加载数据

yarn add --save-dev csv-loader xml-loader

const path = require('path');

 module.exports = {
   entry: './src/index.js',
   output: {
     filename: 'bundle.js',
     path: path.resolve(__dirname, 'dist'),
   },
   module: {
     rules: [
       {
         test: /\.css$/i,
         use: ['style-loader', 'css-loader'],
       },
       {
         test: /\.(png|svg|jpg|jpeg|gif)$/i,
         type: 'asset/resource',
       },
       {
         test: /\.(woff|woff2|eot|ttf|otf)$/i,
         type: 'asset/resource',
       },
+      {
+        test: /\.(csv|tsv)$/i,
+        use: ['csv-loader'],
+      },
+      {
+        test: /\.xml$/i,
+        use: ['xml-loader'],
+      },
     ],
   },
 };

9.自定义JSON解析器

yarn add toml yamljs json5 --save-dev

const path = require('path');
+const toml = require('toml');
+const yaml = require('yamljs');
+const json5 = require('json5');

 module.exports = {
   entry: './src/index.js',
   output: {
     filename: 'bundle.js',
     path: path.resolve(__dirname, 'dist'),
   },
   module: {
     rules: [
       {
         test: /\.css$/i,
         use: ['style-loader', 'css-loader'],
       },
       {
         test: /\.(png|svg|jpg|jpeg|gif)$/i,
         type: 'asset/resource',
       },
       {
         test: /\.(woff|woff2|eot|ttf|otf)$/i,
         type: 'asset/resource',
       },
       {
         test: /\.(csv|tsv)$/i,
         use: ['csv-loader'],
       },
       {
         test: /\.xml$/i,
         use: ['xml-loader'],
       },
+      {
+        test: /\.toml$/i,
+        type: 'json',
+        parser: {
+          parse: toml.parse,
+        },
+      },
+      {
+        test: /\.yaml$/i,
+        type: 'json',
+        parser: {
+          parse: yaml.parse,
+        },
+      },
+      {
+        test: /\.json5$/i,
+        type: 'json',
+        parser: {
+          parse: json5.parse,
+        },
+      },
     ],
   },
 };

针对不同类型的数据,可以通过不同的解析器来进行解析打包,同时也提示观看的你,这只是简单针对不同的文件进行不同的loader配置,那么针对这些静态资源,以及我们平常中常见的静态资源,甚至还要考虑到项目之间移植的问题,请看下期。

老铁们,最近市场行情怎么样式,欢迎留言