# Nuxt容器化过程中引发的疑问

# 为什么@nuxt/vuetify这个模块是配置在buildModules属性中

buildModules配置属性是Nuxt v2.9引入的,目的是减少一些开发以及构建阶段,使得生产环境启动更快速,并且能够减小生产环境中node_modules的大小。

@nuxt/vuetify这个包之所以不用在正式环境中安装,是因为该包源代码中指明了vuetify/lib中的文件需要经过webpack处理(node_modules/@nuxtjs/vuetify/build.js):

经过webpack处理的文件会出现在打包之后的文件中,因此vuetify相关包不必再安装至node_modules。

# 为什么打包完成后,只将.nuxt文件夹引入容器中还不行,还需要node_moduels?

vue create出来的spa项目,通常打包之后只需要将dist文件夹放入到nginx的docker镜像中即可,但是ssr项目却还依赖于用户环境(node,依赖包node_modules)。如果跟随过vue ssr文档 (opens new window)配置过ssr环境就很清楚,关于server端的打包过程中,会在webpack配置文件中指定external字段,该字段的值将会设置为排除第三方依赖包(可见构建配置 (opens new window)中webpack配置代码注释)。被排除的依赖包,将会在运行时的时候从node_moduels引入。所以如果只引入.nuxt文件夹,访问页面会出现包无法找到的错误。

# Nuxt项目容器化建议

容器化可以采用多阶段构建的方式,第一个阶段中执行build,第二个阶段中安装production环境依赖并启动项目。阶段一中产生出来的.nuxt文件夹和node_modules可以传递给阶段二,这里的node_modules可以执行npm prune --production保留必要的包。