Webpack 无法解析 node_modules 惰性资产

Eva*_*dge 6 webpack vue.js monorepo vue-cli

我正在开发一个 vuejs 项目,我们正在尝试使用外部 vue cli 应用程序作为库。在这些库中,我们希望能够导出一个路由器配置,它可以延迟加载这些模块之一中的组件。然而,当我们使用 vue-cli-service 将它编译成一个库并且它有惰性块资产时,我们无法使用 webpack 解决它们。

我有一种感觉,它与公共路径或一些简单的配置有关,但在这个阶段我只是被卡住了,头撞墙了。

https://github.com/EvanBurbidge/mono-repo-tester

这是我们正在做的事情的简单概述

App1 -> main app, installs App2, imports { router } from 'app2'
App2 -> library, compiles to common js lib exports router config
Run Code Online (Sandbox Code Playgroud)

app1 的控制台输出 see_screenshot_1 app2的路由器配置 see_screenshot_2 从 app1 导入 app2 的路由器 see_screenshot_3

/* config.module.rule('js') */ { test: /\.jsx?$/, exclude: [ function () { /* omitted long function */ } ], use: [ /* config.module.rule('js').use('cache-loader') */ { loader: 'cache-loader', options: { cacheDirectory: '/Users/evan/test/node_modules/.cache/babel-loader', cacheIdentifier: '39e7e586' } }, /* config.module.rule('js').use('babel-loader') */ { loader: 'babel-loader' } ] },

Gur*_*sad 6

我想我知道问题是什么。

看起来您正在遭受这样一个事实,即与 VueJS 捆绑在一起的 webpack 的默认配置不支持您要完成的任务。事实上,很可能Webpack不支持你想要完成的#2471 #6818 #7843

当您将 app2 编译成 UMD 并尝试通过导入 UMD 在 app1 中使用它时,不会解析 app2 的动态导入,因此不会复制到publicPathapp1 的 。由于它是动态导入,因此编译会成功到您可以部署应用程序的程度。但是,当您尝试加载应用程序时,它开始抱怨缺少块。

这是解决此问题的一种方法:

app2/package.json

{
  "name": "app2",
  ...
  "main": "src/router.js"
}
Run Code Online (Sandbox Code Playgroud)

app2/src/router.js

const Hey = () => import(/*webpackChunkName: 'app2.Hello.vue' */ './components/HelloWorld.vue')

export default [
  {
    path: '/app2',
    component: Hey,
    name: 'app2.hey'
  }
]
Run Code Online (Sandbox Code Playgroud)

app1/router.js

import app2Router from 'app2'
import Home from './views/Home.vue'

export default new Router([
  mode: 'history',
  ...
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home
    },
    ...app2Router
  ]
])
Run Code Online (Sandbox Code Playgroud)

通过将mainor moduleof标记为app2/package.jsonasrouter.js而不是 UMD 包,您将强制 app1 构建整个依赖关系图并包含检测到的任何动态导入。这反过来会导致正确复制依赖项。

您还可以通过使用获得完全相同的结果

import app2Router from 'app2/src/router'
Run Code Online (Sandbox Code Playgroud)