Webpack模块引用中还有什么坑?

栏目: 编程工具 · 发布时间: 5年前

内容简介:大家都知道(如果暂时还不清楚的可以戳这里>>),最近在引用自己写的一个插件的时候,偶然发现webpack下引用构建截图:

大家都知道(如果暂时还不清楚的可以戳这里>>), umd 格式是跨平台的模块解决方案,node和浏览器的兼容写法,但直接在node中使用还是存在问题的:

问题复现

最近在引用自己写的一个插件的时候,偶然发现webpack下引用 node_modules 下的文件与直接引用文件夹中的文件表现不一致。文件内容都是由webpack打包出的同一个文件 umd.js ,从 node_modules 引入的可以直接使用,但是从 普通文件夹中 引入的文件在浏览器中会报错,到底是什么原因??是人性的扭曲还是道德的沦丧??

问题详细描述

// vue.config.js
  let config = {
      baseUrl: process.env.NODE_ENV === "production" ? "/ele-multi-cascader/" : "/",
  
      configureWebpack: {
          output: {
              libraryExport: "default"
          }
      }
  };
  
  module.exports = config;
  
  // babel.config.js
  module.exports = {
    presets: [
      ["@vue/app", {
        useBuiltIns: "usage"
      }]
    ]
  };
  
  // cli3 构建命令 --target lib 构建符合umd规范产出
  // vue-cli-service build --name cascader --entry ./src/index.js --target lib --mode production
复制代码

构建截图:

Webpack模块引用中还有什么坑?

为了排除 cli3 插件的干扰,我使用 cli2vue 项目也进行了尝试,表现都是一致的!

// 成功
import Vue from 'vue'

import eleMultiCascader from "../node_modules/ele-multi-cascader/dist/cascader.umd";

import eleMultiCascader from "ele-multi-cascader/dist/cascader.umd";

import eleMultiCascader from "ele-multi-cascader";

let eleMultiCascader = require("../node_modules/ele-multi-cascader/dist/cascader.common");

let eleMultiCascader = require("ele-multi-cascader/dist/cascader.umd");

let eleMultiCascader = require("ele-multi-cascader");


// 失败
import eleMultiCascader from "../dist/cascader.common";

let eleMultiCascader = require("../dist/cascader.umd")

// 在页面直接引用
// <script src="./cascader.umd.js"></script>
复制代码

初步表现为,只要是从 node_modules 中引入的文件,都可以正常使用。

  • 引用成功的都顺利打印出了插件对象,看起来是这么美好…
Webpack模块引用中还有什么坑?
  • 引用失败车祸现场
Webpack模块引用中还有什么坑?

点进去发现是 Vueundefined ,WTF?

Webpack模块引用中还有什么坑?
Webpack模块引用中还有什么坑?

How to resolve?

最开始一直认为是node的 模块引用机制 导致的问题,后来再次仔细了解了相关规范, node 支持的是 commonJs ,而 umd 是兼容 commonJs 的所以跟node的 模块机制 没有关系。

睡午觉的时候还在想这个问题,经过以上的种种表现可以推测,只能是 webpack 打包导致的问题。 umd 这种兼容语法在 node 环境中直接 require 是不能直接使用的,如果要正常使用,必须要通过转码。嗯,转码!!

是谁负责转码呢?肯定是 Babel 了,只是不知道具体用的哪个插件。到这里问题已经解决了 90% 了。

plugin-transform-modules

打开 node_modules@babel 文件夹可以看到关于模块转换的几个插件!

Webpack模块引用中还有什么坑?

真相已经很明确了,就是这个 plugin-transform-modules-umdbabel 会默认对 node_modules 中引入的文件做相应规范的转码,而别的文件夹不会,除非你手动配置。

打开官网可以看到一系列的介绍,就不做文档搬运了,粗暴的在项目中配置了一下。

// babel.config.js
module.exports = {
    presets: [
        [
            "@vue/app",
            {
                useBuiltIns: "usage"
            }
        ]
    ],
    // here
    plugins: ["@babel/plugin-transform-modules-umd"]
}

// main.js
import eleMultiCascader from "../dist/cascader.common";
console.log("TCL: eleMultiCascader", eleMultiCascader)
复制代码

怀着激动的心情运行了下 yarn serve ,终于在控制台看见了清爽的一幕!问题成功解决。

Webpack模块引用中还有什么坑?

结语

平时在繁忙的搬砖中可能都没遇到这个问题,关心的最多的可能也只是 babelrc 的配置方法。熟练的使用着cli工具,安静地当着 配置工程师 。cli固然是提升效率的法宝,但是在使用他们的时候应该去想想它背后都有些 工具 在默默地支持,不要求深入地了解每个细节,但是大致的架构,运行原理的了解是很有必要的。有了这些架构和原理的指引,以后遇到任何问题也不会像一个无头苍蝇,无从下手…。至少有个方向,方向对了也就意味着离真相不远了!

好了,这次踩坑与大家共勉!如果发现说的不对的地方,欢迎指正!

最后再无耻地打个广告,主角就是上面引出问题的那个插件,一个基于 ElementUI多选级联选择器 。欢迎使用,欢迎 Start 链接在此>> ,逃~


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

领域特定语言

领域特定语言

Martin Fowler / ThoughtWorks中国 / 机械工业出版社华章公司 / 2013-3 / 89.00元

本书是DSL领域的丰碑之作,由世界级软件开发大师和软件开发“教父”Martin Fowler历时多年写作而成,ThoughtWorks中国翻译。全面详尽地讲解了各种DSL及其构造方式,揭示了与编程语言无关的通用原则和模式,阐释了如何通过DSL有效提高开发人员的生产力以及增进与领域专家的有效沟通,能为开发人员选择和使用DSL提供有效的决策依据和指导方法。 全书共57章,分为六个部分:第一部分介......一起来看看 《领域特定语言》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具