从零开始使用webpack 搭建vue项目

从零开始使用webpack 搭建vue项目 1 创建项目 npm init 生成 package,json 创建 index,html webpack

本文包含相关资料包-----> 点击直达获取<-------

从零开始使用webpack 搭建vue项目

1 创建项目

  1. npm init 生成 package.json
  2. 创建 index.html webpack.confug.js

diff project-name |- index.html + |- index.js |- package.json + |- webpack.config.js

``` html

webpack学习

```

``` javascript // webpack.config.js 'use strict'

const path = require('path')

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

```

  1. 安装Webpack npm install --save-dev webpack webpack-cli

diff + webpack-cli@4.9.2 + webpack@5.73.0

  1. 修改 package.json

diff "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "build": "webpack --config webpack.config.js" }, { "scripts": { - "build": "webpack" + "build": "webpack --config webpack.config.js" } }

2 启动服务

使用 webpack-dev-server 来启动本地服务 1. 安装 npm install --save-dev webpack webpack-dev-server 2. 修改 package.json

```diff { "scripts": { + "dev": "webpack serve", "build": "webpack" } }

3. webpack.config.js修改端口号 javascript module.exports = { // ... devServer: { compress: true, port: 8080 } } ```

3 生成 HTML 文件

使用 html-webpack-plugin 来生成 HTML 文件

  1. 执行 npm install --save-dev html-webpack-plugin
  2. 修改 webpack.config.js

``` javascript const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = { // ... plugins: [ new HtmlWebpackPlugin({ filename: 'index.html', template: './index.html' }) ] } ```

4 安装vue

  1. 执行 npm install --save-dev vue-loader vue-template-compiler
  2. 执行 npm install --save vue vue-router
  3. 在 webpack.config.js 中配置 vue-loader 用于引入 .vue 类型文件

```javascript const {VueLoaderPlugin} = require('vue-loader')

module.exports = { // ... module: { rules: [ { test: /.vue$/, use: [ { loader: 'vue-loader' } ] } ] }, plugins: [ new VueLoaderPlugin() ] } ``` 4. 新建一个 app.vue 文件作为路由组件的容器 以及补充 index.js

```html

javascript // index.js import { createRouter, createWebHistory, createWebHashHistory } from "vue-router";

import { createApp } from "vue"; import App from './app.vue'

const routes = [ { path: "/", name: "index", component: () => import('./index.vue') } ] const router = createRouter({ history: createWebHashHistory(), mode: "hash", routes: routes }); createApp(App).use(router).mount("#app");

``` 5. 新建一个 index.vue 文件作为首页

```javascript

这是首页

```

5 配置 Babel

  1. 执行 npm install --save-dev @babel/core @babel/preset-env babel-loader

  2. 修改webpack.config.js javascript module.exports = { // ... module: { //... rules: [ // ... { test: /\.js$/, exclude: /node_modules/, use: [ { loader: 'babel-loader' } ] } ] } }

  3. 创建一个 .babelrc 文件在根目录

javascript // .babelrc { "presets": ["@babel/preset-env"] } 参考--谈谈babel的preset-env


以上是完成了基础的项目运行 ↑

接下来进行webpack的优化 ↓


6 添加build包大小分析 webpack-bundle-analyzer

参考文章链接 webpack-bundle-analyzer可视化分析包大小

  1. 安装 npm install --save-dev webpack-bundle-analyzer

  2. webpack.config.js 中添加配置

``` javascript // webpack.config.js const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; module.exports = { // ... plugins: [ // 开启 BundleAnalyzerPlugin new BundleAnalyzerPlugin(), ], };

// 默认配置项 new BundleAnalyzerPlugin({ // 可以是 server static disabled 。 // 在 server 模式下,分析器将启动HTTP服务器来显示软件包报告。 // 在“静态”模式下,会生成带有报告的单个HTML文件。 // 在 disabled 模式下,你可以使用这个插件来将 generateStatsFile 设置为 true 来生成Webpack Stats JSON文件。 analyzerMode: 'server', // 将在“服务器”模式下使用的主机启动HTTP服务器。 analyzerHost: '127.0.0.1', // 将在“服务器”模式下使用的端口启动HTTP服务器。 analyzerPort: 8888, // 路径捆绑,将在 static 模式下生成的报告文件。 // 相对于捆绑输出目录。 reportFilename: 'report.html', // 模块大小默认显示在报告中。 // 应该是 stat parsed 或者 gzip 中的一个。 // 有关更多信息,请参见“定义”一节。 defaultSizes: 'parsed', // 在默认浏览器中自动打开报告 openAnalyzer: true, // 如果为true,则Webpack Stats JSON文件将在bundle输出目录中生成 generateStatsFile: false, // 如果 generateStatsFile true ,将会生成Webpack Stats JSON文件的名字。 // 相对于捆绑输出目录。 statsFilename: 'stats.json', // stats.toJson()方法的选项。 // 例如,您可以使用 source:false 选项排除统计文件中模块的来源。 // 在这里查看更多选项:https: //github.com/webpack/webpack/blob/webpack-1/lib/Stats.js#L21 statsOptions: null, logLevel: 'info' // 日志级别。可以是'信息','警告','错误'或'沉默'。 })

```

  1. 启动配置

javascript // package.json "analyz": "NODE_ENV=production npm_config_report=true npm run build" // 运行npm run analyz后打开 127.0.0.1:8888 可以可视化分析包大小信息

7. 项目结构调整

为了项目的完整可持续发展,对项目目录进行调整。为了方便后续调整文件路径以及路径太长,需要配置一个根目录标识

  1. 修改webpack.config.js 中的alias参数

javascript module.exports = { // ... resolve: { alias: { '@': path.join(__dirname, 'src') } } }

9 添加css style sass相关的loder

1. 执行 ` npm install --save-dev css-loader style-loader sass-loader sass

2. 修改 webpack.config.js 配置

``` javascript module.exports = { module: { rules: [ { test: /.css$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader' } ] } ] } }

```

3. 安装postcss-loader 以及插件示例(厂商前缀添加、px转rem)

功能:不能简单的把 PostCSS 归类成 CSS 预处理或后处理工具。
+ 1 、CSS 解析成 JavaScript 可以操作的 AST 。 
+ 2、 就是调用插件来处理 AST 并得到结果。

执行 npm install --save-dev postcss-loader postcss

例如1:统一添加厂商前缀添加

npm install --save-dev postcss-preset-env

``` diff module.exports = { module: { rules: [ //... { test:/.css$/, use:[ { loader: MiniCssExtractPlugin.loader, options: { // 这里可以指定一个 publicPath // 默认使用 webpackOptions.output中的publicPath // publicPath的配置,和plugins中设置的filename和chunkFilename的名字有关 // 如果打包后,background属性中的图片显示不出来,请检查publicPath的配置是否有误 publicPath: './',
// publicPath: devMode ? './' : '../', // 根据不同环境指定不同的publicPath // hmr: devMode, // 仅dev环境启用HMR功能 }, }, "css-loader", + 'postcss-loader' ],

       }
    ],
  },
],

}, }; ```

新增 postcss.config.js 配置文件

```javascript

module.exports = { plugins: [ [ "postcss-preset-env", { autoprefixer:{ grid: true }, browsers: 'last 2 versions' //这里很关键,原先是在package.json里面配置browserslist,但好像无效,花了很多时间,一直不知到问题,后面添加了这个就有效了,应该是browserslist配置的有问题。暂时先不研究了。 }, ], ], }; ```

例如2:统一px转rem 或者可以参考 (链接 postcss-px-to-viewport ),在淘宝flexible github上说’建议大家开始使用viewport来替代此方。‘

安装$ npm install postcss postcss-pxtorem --save-dev

  • 配置postcss.config.js

```javascript

module.exports = { plugins: [ // ... [ "postcss-pxtorem", { rootValue: 37.5,//表示根元素字体大小

    //  unitPrecision: 5,//允许REM单位增长到的十进制数字。
    propList:['*','!font*'],//类似对正则匹配的设置黑白名单
    // selectorBlackList:['body'],//设置白名单的标签或者正则匹配到的选择器
    // minPixelValue:1,//设置要替换的最小像素值。
    // mediaQuery:true,//(布尔)允许在媒体查询中转换px。
    exclude:/node_modules/i//需要忽略的文件路径

  }
]

], }; ```

postcss-petorem使用参考链接

其他例子:postcss-sprites(合并雪碧图片)...

4. css提取单独的文件 mini-css-extract-plugin

本插件会将 CSS 提取到单独的文件中,为每个包含 CSS 的 JS 文件创建一个 CSS 文件,并且支持 CSS 和 SourceMaps 的按需加载
  1. 安装 npm install --save-dev mini-css-extract-plugin
  2. 配置webpack.config.js

```javascript const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = { plugins: [new MiniCssExtractPlugin({ // ...配置 })], module: { rules: [ { test: /.css$/i, use: [MiniCssExtractPlugin.loader, "css-loader"], }, ], }, }; ```

10. 资源模块 官方介绍

在webpack5之前对于资源加载一般都是 row-loader,url-loader file-loader webpack5 拥有asset module type 可以替换4中新的模块类型 - asset/resource == file-loader - asset/inline == url-loader - asset/source == row-loader - asset

javascript // // ... module: { // noParse: /jquery|lodash/, //可以忽略大型的library可以提高构建性能 rules: [ { test: /\.(png|jpg|gif|jpeg)(\?[a-z0-9]+)?$/, type: 'asset/resource', parser:{ dataUrlCondition:{ maxSize: 10 * 1024,//小10KB的资源以内联base64的形式(默认) } } }, // ... ] } 参考 webpack5.0中打包css背景图片生成重复,不能显示的问题考究

11. 区分开发环境和生产环境

  • 执行 npm install --save-dev cross-env cross-env 可以跨平台设置使用环境变量
  • 执行 npm install --save-dev webpack-merge webpack-merge可以便捷的合并webpack的配置

将原先的webpack.config.js 拆分到 webpack.common.js 、 webpack.config.dev.js 、 webpack.config.prod.js 通过配置package.js中的环境变量执行不同的webpack配置,实现分环境打包

12. 打包速度优化

    1. 设置缓存cache webpack5 可以通过cache 特性来将webpack工作缓存到硬盘中。存放的路径为node_modules/.cache/webpack

构建速度优化接近90%

webpack5 其实就是内置了插件 HardSourceWebpackPlugin

webpack4如果要使用可以参考文档进行配置 HardSourceWebpackPlugin

webpack3一直使用的是dll的方式进行提取第三方库代码,内置插件DllPlugin和DllReferencePlugin

```javascript // webpack.config.js module.exports = { cache: { // 1. 将缓存类型设置为文件系统 type: 'filesystem', // 默认是memory // 2. 将缓存文件夹命名为 .temp_cache, // 默认路径是 node_modules/.cache/webpack cacheDirectory: path.resolve(__dirname, '.temp_cache'),

} } // 没加这个配置build时间:9000ms // 加上这个配置后首次build时间: 9700ms // 后续重新build时间:765ms

// npm run dev 5486ms => 1312ms ``` 参考文档-深度解析webpack5持久化缓存 参考文档-Webpack 性能系列一: 使用 Cache 提升构建性能

    1. dll 在webpack5出来之后,基本可以不用考虑。即将过时。
    1. 多进程进行构建loader

通过 thread-loader 将耗时的 loader 放在一个独立的 worker 池中运行,加快 loader 构建速度。

执行 npm i -D thread-loader

javascript module.exports = { rules: [ { test: /\.module\.(scss|sass)$/, include: paths.appSrc, use: [ "style-loader", { loader: "css-loader", options: { modules: true, importLoaders: 2, }, }, { loader: "postcss-loader", options: { postcssOptions: { plugins: [["postcss-preset-env"]], }, }, }, { loader: "thread-loader", options: { workerParallelJobs: 2, // webpack 官网 提到 node-sass 中有个来自 Node.js 线程池的阻塞线程的 bug。 当使用 thread-loader 时,需要设置 workerParallelJobs: 2。 }, }, "sass-loader", ].filter(Boolean),//过滤掉为undefined的plugin }, ], };

需要注意的是适用于项目较大的项目,小项目没必要,因为启动耗时的时间可能比节省的时间还多

happypack happypack 同样是用来设置多线程,但是在 webpack5 就不要再使用 happypack 了,官方也已经不再维护了,推荐使用上文介绍的 thread-loader。

    1. 指定include

为 loader 指定 include,减少 loader 应用范围,仅应用于最少数量的必要模块,。

javascript module.exports = { rules: [ { test: /\.(js|ts|jsx|tsx)$/, include: paths.appSrc, use: [ { loader: "esbuild-loader", options: { loader: "tsx", target: "es2015", }, }, ], }, ], };

13. 打包后项目的加载优化

  • 按需加载
  • 浏览器缓存
  • CDN

  • 按需加载

webpack提供import()语法 动态导入功能进行代码分离,通过按需加载提升网页加载速度

javascript export default function App() { return ( <div> hello react 111 <Hello /> <button onClick={() => import("lodash")}>加载lodash</button> </div> ); }

  1. 浏览器缓存

webpack 支持根据资源内容,创建 hash id,当资源内容发生变化时,将会创建新的 hash id。

```javascript // webpack.common.js module.exports = { // 输出 output: { // 仅在生产环境添加 hash //开发环境不配置原因:开发环境有热更新,如果有hash值的话,会刷新页面 filename: ctx.isEnvProduction ? "[name].[contenthash].bundle.js" : "[name].bundle.js", }, plugins: [ // 提取 CSS new MiniCssExtractPlugin({ // 这里的配置和webpackOptions.output中的配置相似 // 即可以通过在名字前加路径,来决定打包后的文件存在的路径 filename: devMode ? 'css/[name].css' : 'css/[name].[contenthash].css', chunkFilename: devMode ? 'css/[id].css' : 'css/[id].[contenthash].css', }), ], };

//webpack.prod.js module.exports = { optimization: { moduleIds: "deterministic", // }, };

```

将所有的静态资源,上传至 CDN,通过 CDN 加速来提升加载速度。

javascript export.modules = { output: { publicPath: ctx.isEnvProduction ? 'https://xxx.com' : '', // CDN 域名 }, }

14.减小打包后体积

  • 代码压缩 js压缩\ css压缩
  • 代码分离 css分离\ js抽离公共\ entry chunk
  • 树摇 cdn

1. 代码压缩

- js 压缩

使用 TerserWebpackPlugin 来压缩 JavaScript。

webpack5 自带最新的 terser-webpack-plugin,无需手动安装。

terser-webpack-plugin 默认开启了 parallel: true 配置,并发运行的默认数量: os.cpus().length - 1 ,本文配置的 parallel 数量为 4,使用多进程并发运行压缩以提高构建速度。

如果需要自定义配置,还是需要安装 terser-webpack-plugin

npm install terser-webpack-plugin --save-dev

```javascript const TerserPlugin = require("terser-webpack-plugin");

module.exports = { optimization: { minimize: true, minimizer: [new TerserPlugin({ //... })], }, };

// ParallelUglifyPlugin 它可以帮助我们多进程压缩 JS,webpack5 的 TerserWebpackPlugin 默认就开启了多进程和缓存,无需再引入 ParallelUglifyPlugin。

```

是否开启Gzip压缩。nginx上需要对Gzip进行相关配置

参考文档

```javascript const CompressionWebpackPlugin = require("compression-webpack-plugin");

plugins: [ new CompressionPlugin({ filename: "[path][base].gz", algorithm: "gzip", test: /.js$|.css$|.html$/, threshold: 10240, minRatio: 0.8, }), ], ```

2. css压缩

执行 npm install css-minimizer-webpack-plugin --save-dev

```javascript const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");

module.exports = { module: { rules: [ { test: /.s?css$/, use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"], }, ], }, optimization: { minimizer: [ // 在 webpack@5 中,你可以使用 ... 语法来扩展现有的 minimizer(即 terser-webpack-plugin ),将下一行取消注释 // ... , new CssMinimizerPlugin(), ], }, plugins: [new MiniCssExtractPlugin()], }; ```

2. 代码分离

1 抽离重复代码

代码分离能够把代码分离到不同的 bundle 中,然后可以按需加载或并行加载这些文件。代码分离可以用于获取更小的 bundle,以及控制资源加载优先级,可以缩短页面加载时间。

将公共的模块单独打包,不再重复引入,效果如下:

```javascript // webpack.prod.js 配置方式如下: module.exports = { // ... optimization: { splitChunks: { chunks: 'all',//all,async,initial 三个参数区别参考https://blog.csdn.net/qq_41887214/article/details/124527169 minSize: 2000,////当导入的模块最小是多少字节才会进行代码分割 // minRemainingSize: 0, minChunks: 1,////当一个模块被导入(引用)至少多少次才对该模块进行代码分割 maxAsyncRequests: 30,//按需加载时的最大并行请求数 maxInitialRequests: 30,//入口点的最大并行请求数 // enforceSizeThreshold: 50000,

    cacheGroups: {//缓存组,这里是我们表演的舞台,抽取公共模块什么的,都在这个地方
      defaultVendors: {
        test: /[\\/]node_modules[\\/]/,
        priority: -10,
        reuseExistingChunk: true,
        // name: "defaultVendors",
        //Webpack 优化分包之 name https://zhuanlan.zhihu.com/p/103729115
      },
      default: {
        minChunks: 2,
        priority: -20,
        reuseExistingChunk: true,
        // name: "vendors",
      },
    },
  },
},

}

```

官方建议name值选择不填,默认是true

2 css文件分离

MiniCssExtractPlugin 插件将 CSS 提取到单独的文件中,为每个包含 CSS 的 JS 文件创建一个 CSS 文件,并且支持 CSS 和 SourceMaps 的按需加载。

前面已经有提到过改插件的使用

注意:MiniCssExtractPlugin.loader 要放在 style-loader 后面。

3 最小化entry chunk

通过配置 optimization.runtimeChunk = true,为运行时代码创建一个额外的 chunk,减少 entry chunk 体积,提高性能。

```javascript

module.exports = { optimization: { runtimeChunk: true, }, }; } ```

3. Three Shaking (树摇) ---将没有用到的Dead Code 代码不进行打包

1. js

Dead Code 一般具有以下几个特征:

  • 代码不会被执行,不可到达;
  • 代码执行的结果不会被用到;
  • 代码只会影响死变量(只写不读)
1 配置package.js "sideEffects"

开启production环境就会自动启动tree shaking即 sideEffects:false(代表所有文件无副作用)

需要注意的是当sideEffect:false时 这可能会把css / @babel/polyfill (副作用)等文件干掉

所以一般需要配置一些有副作用的文件,或者后缀

```javascript // ... "sideEffects": [ " /*.css", " /*.scss", "./esnext/index.js", "./esnext/configure.js" ], // ...

```

##### 2. 对组件库引用的优化

webpack5 sideEffects 只能清除无副作用的引用,而有副作用的引用则只能通过优化引用方式来进行 Tree Shaking。

  • lodash

类似 import { throttle } from 'lodash' 就属于有副作用的引用,会将整个 lodash 文件进行打包。

优化方式是使用 import { throttle } from 'lodash-es' 代替 import { throttle } from 'lodash'

lodash-es 将 Lodash 库导出为 ES 模块,支持基于 ES modules 的 tree shaking,实现按需引入。

  • ant-design

ant-design 默认支持基于 ES modules 的 tree shaking,对于 js 部分,直接引入 import { Button } from 'antd' 就会有按需加载的效果。

假如项目中仅引入少部分组件,import { Button } from 'antd' 也属于有副作用,webpack 不能把其他组件进行 tree-shaking。这时可以缩小引用范围,将引入方式修改为 import { Button } from 'antd/lib/button' 来进一步优化。

2. CSS

使用 purgecss-webpack-plugin 对 CSS Tree Shaking。

相关配置介绍官网

purgeCSS中文文档地址

执行 npm i purgecss-webpack-plugin -D

因为打包时 CSS 默认放在 JS 文件内,因此要结合 webpack 分离 CSS 文件插件 mini-css-extract-plugin 一起使用,先将 CSS 文件分离,再进行 CSS Tree Shaking。

`` javascript const PurgeCSSPlugin = require('purgecss-webpack-plugin')//css树摇插件 const glob = require("glob") // 获取文件夹绝对路径方法 const getDirPath=function(dirName){ return path.join(__dirname, dirName) } const purgeFiles = glob.sync( ${getDirPath("../src")}/ /* , { nodir: true }) purgeFiles.push(path.resolve(__dirname, "../public/index.html")) console.log('purgeFilesList',purgeFiles) module.exports = { plugins:[ // ... new PurgeCSSPlugin({ paths: purgeFiles, content: [ ../public/ / .html , ../src/ / .vue` ], defaultExtractor (content) { const contentWithoutStyleBlocks = content.replace(/<style[^]+?<\/style>/gi, '') return contentWithoutStyleBlocks.match(/[A-Za-z0-9-_/:] [A-Za-z0-9-_/]+/g) || [] }, safelist: [ /-(leave|enter|appear)(|-(to|from|active))$/, /^(?!(|. ?:)cursor-move).+-move$/, /^router-link(|-exact)-active$/, /data-v-.*/ ], }) ] }

```

需要注意的是 : + 1、对应的vue、react在官网有对应的插件配置,不然会树摇掉有用的css. + 2、插件需要配合MiniCssExtractPlugin

3. CDN

这里单纯为了减小包体积,进行将大的图片、字体等资源压缩上传至CDN来减小服务器压力

另外一种为了加快加载速度的CDN方式在前面已经提到过了

15. 环境变量获取,全局变量设置等webpack工具

安装: npm install dotenv --save

介绍: 环境变量加载工具

使用:

```javascript // .env // VUE_APP_BINGMAP_KEYS=ApGt6MdeC3ZVLFu3jwf6vOax4gk4iatUgPeiQuodLXu_PPeWsXRp672eWPMpUpaL // VUE_APP_TASERVERURL=199f9f62e86a9048bace6a5eee63a995

const dotenv = require('dotenv').config({path:'.env'}) console.log('process',process) //process.env 对象中会混合.env中定义的变量VUE_APP_BINGMAP_KEYS,VUE_APP_TASERVERURL console.log('dotenv',dotenv)// // dotenv { // parsed: { // VUE_APP_BINGMAP_KEYS: 'ApGt6MdeC3ZVLFu3jwf6vOax4gk4iatUgPeiQuodLXu_PPeWsXRp672eWPMpUpaL', // VUE_APP_TASERVERURL: '199f9f62e86a9048bace6a5eee63a995' // } // } ```

执行:Webpack5自带

介绍: DefinePlugin 允许创建一个在编译时可以配置的全局常量

使用:

javascript // 原先记得在项目js中直接可以访问到process.env。但貌似webpack5搭建的项目直接访问是undefined。 // 原因 webpack5 相较 wp4 取消了内置的 polyfill (如 process 等) new webpack.DefinePlugin({ // Definitions... APP_ENV: JSON.stringify(process.env), APP_CUSTON:"我是全局变量" }), 浅谈webpack5自动注入环境polyfill的策略 文章中介绍了另一种方法,实现项目js中可以访问process, 感觉可行,暂时没试

执行: Webpack5自带

介绍:webpack配置ProvidePlugin后,在使⽤时将不再需要import和require进⾏引⼊,直接使⽤即可

使用:

```javascript // webpack.config.js module.export = { // ... plugins: [ // ... // 相当于自动require,并且在项目全局可以用别名identifier,进行使用 new webpack.ProvidePlugin({ api: [path.join(__dirname, '../src/assets/js/utils.js'), 'default'], // identifier: 'module1', // identifier: ['module1', 'property1'], }) ] }

// xxx.js api()//...可以直接使用 ```

  • alias DefinePlugin ProvidePlugin 三者区别

  • alias: 只是单纯的别名,可以理解 :为文件目录配置一个别名

  • DefinePlugin: 定义全局变量,应用场景主要是配置不同的环境区别(生产、测试、debug等)

  • ProvidePlugin: 提供全局的变量,在模块中使用无需用require引入

16. 手写Plugins

17. 手写Loader(加载器)

参考文档 --- 揭秘webpack loader

Loader概述: webpack 只能直接处理 javascript 格式的代码。任何非 js 文件都必须被预先处理转换为 js 代码,才可以参与打包。loader(加载器)就是这样一个代码转换器。它由 webpack 的 loader runner 执行调用,接收原始资源数据作为参数(当多个加载器联合使用时,上一个loader的结果会传入下一个loader),最终输出 javascript 代码(和可选的 source map)给 webpack 做进一步编译。

个人通俗理解就是加载源文件 字符串,转化为需要的字符串

  • 如何创建自定义loader

    1. 全局替换字符串

loader 是一个导出一个函数的 node 模块。 ```javascript // webpack.config.js module.exports = { // ... module:{ rules:[ { test: /.vue$/, use: [ { loader: 'vue-loader', }, { loader:path.resolve(__dirname, "../src/loader/namereplace") // 使用 path 模块找到 hxkj-loader 的路径 }, ], }, ] } } // namereplace.js module.exports = function(source){ var content=""; console.log('content1',source) content = source.replace(/页面/g,"「页面」"); // console.log('content2',content) return content; }

```

    1. 实现style-loader

参考文档

参考文献

  • 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航)
  • 基于Vue.js框架的Web前端开发工具的设计与实现(北京邮电大学·刘启伟)
  • 基于低代码的前端关键技术研究与实现(西安电子科技大学·周鑫磊)
  • 基于J2EE规范的通用型整合框架的研究与应用——以亚信科技(中国)大型商业项目中国移动BOSS系统开发为例(上海师范大学·王林强)
  • 基于Vue.js框架的Web前端开发工具的设计与实现(北京邮电大学·刘启伟)
  • 基于AJAX的信息聚合系统的研究与实现(武汉理工大学·蒋佳)
  • 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航)
  • J2EE平台下快速WEB开发的研究与应用(武汉理工大学·李涛)
  • 一种Web应用框架的设计与实现(·河北师范大学)
  • Web应用快速开发工具设计与实现(山东大学·郭文学)
  • 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航)
  • 基于低代码的前端关键技术研究与实现(西安电子科技大学·周鑫磊)
  • 基于AJAX的信息聚合系统的研究与实现(武汉理工大学·蒋佳)
  • J2EE平台下快速WEB开发的研究与应用(武汉理工大学·李涛)
  • 基于J2EE的中小企业通用网站的架构设计与开发(北京交通大学·李金龙)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:代码小屋 ,原文地址:https://bishedaima.com/yuanma/36142.html

相关推荐

发表回复

登录后才能评论