开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1895|回复: 0
收起左侧

[技术分享] 从uni-app源码解析其入口文件设置

[复制链接]
发表于 2021-10-29 15:29:06 | 显示全部楼层 |阅读模式   广东省揭阳市

在uni-app官方文档中指出默认项目入口是main.js


但是在实际项目中,项目入口在src/main.ts,具体是如何指定的呢?
已知,uni-app的构建指令是vue-cli-service uni-buildvue-cli-service默认会执行package.json中配置的所有vue-cli-plugin插件,uni-app项目配置了vue-cli-plugin-uni插件,当构建项目时,会执行该插件。
vue-cli-plugin-uni源码包中,分别为不同平台指定了Vue配置。其中,

  • 移动端:node_modules/@dcloudio/vue-cli-plugin-uni/lib/app-plus/index.js
  • h5:node_modules/@dcloudio/vue-cli-plugin-uni/lib/h5/index.js
  • 小程序:node_modules/@dcloudio/vue-cli-plugin-uni/lib/mp/index.js

vue-cli-plugin-uni的入口文件中,根据执行vue-cli-service指令时传递的环境变量,选择性加载指定平台的Vue配置,再结合webpack配置提供给webpack

// node_modules/@dcloudio/vue-cli-plugin-uni/index.js
  ...
  const type = ['app-plus', 'h5'].includes(process.env.UNI_PLATFORM)
    ? process.env.UNI_PLATFORM
    : 'mp'

  const platformOptions = require('./lib/' + type)

  let vueConfig = platformOptions.vueConfig
  ...
  Object.assign(options, { // TODO 考虑非 HBuilderX 运行时,可以支持自定义输出目录
    outputDir: process.env.UNI_OUTPUT_TMP_DIR || process.env.UNI_OUTPUT_DIR,
    assetsDir
  }, vueConfig) // 注意,此处目前是覆盖关系,后续考虑改为webpack merge逻辑

  require('./lib/options')(options)

  api.configureWebpack(require('./lib/configure-webpack')(platformOptions, manifestPlatformOptions, options, api))
  api.chainWebpack(require('./lib/chain-webpack')(platformOptions, options, api))
  ...

此处只介绍小程序项目的配置,具体配置如下:

//node_modules/@dcloudio/vue-cli-plugin-uni/lib/mp/index.js
...
module.exports = {
    ...
    webpackConfig (webpackConfig, vueOptions, api) {
        ...
        return {
            mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
            entry () {
                return process.UNI_ENTRY
            },
            ...
            module: {
                rules: [{
                  test: path.resolve(process.env.UNI_INPUT_DIR, getMainEntry()),
                  use: [...]
                    },
                    ...
                ]
            },
        }
    }
}

项目入口由环境变量UNI_ENTRY指定,其是根据页面配置得出,默认页面配置文件为项目工作目录/pages.jsonUNI_ENTRY的具体设置如下:

//node_modules/@dcloudio/uni-cli-shared/lib/pages.js
...
process.UNI_ENTRY = {
    'common/main': path.resolve(process.env.UNI_INPUT_DIR, getMainEntry())
}
...
// pages
pagesJson.pages.forEach(page => {
    process.UNI_ENTRY[page.path] = getMainJsPath(page.path)
})
// subPackages
if (Array.isArray(pagesJson.subPackages) && pagesJson.subPackages.length) {
    pagesJson.subPackages.forEach(({
      root,
      pages
    }) => {
        Array.isArray(pages) && pages.forEach(page => {
            if (root) {
                const pagePath = normalizePath(path.join(root, page.path))
                process.UNI_ENTRY[pagePath] = getMainJsPath(pagePath)
                process.UNI_SUB_PACKAGES_ROOT[pagePath] = root
            }
        })
    })
}

项目工作目录由环境变量UNI_INPUT_DIR指定,默认是src,其设置如下

// node_modules/@dcloudio/vue-cli-plugin-uni/lib/env.js
...
const defaultInputDir = 'src'
if (process.env.UNI_INPUT_DIR && process.env.UNI_INPUT_DIR.indexOf('./') === 0) {
  process.env.UNI_INPUT_DIR = path.resolve(process.cwd(), process.env.UNI_INPUT_DIR)
}
process.env.UNI_INPUT_DIR = process.env.UNI_INPUT_DIR || path.resolve(process.cwd(), defaultInputDir)
...

getMainEntry方法的具体实现如下:

//node_modules/@dcloudio/uni-cli-shared/lib/pages.js

function getMainEntry () {
    if (!mainEntry) {
        mainEntry = fs.existsSync(path.resolve(process.env.UNI_INPUT_DIR, 'main.ts')) ? 'main.ts' : 'main.js'
    }
    return mainEntry
}

所以在未指定入口的情况下,uni-app默认指定src/main.ts或src/main.js为项目入口

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表