typescript - NUXT Χρήση κοινών στυλ και σεναρίων εκτός της τοποθεσίας του έργου


Σχεδιάζω να μοιραστώ κώδικα μεταξύ 2 έργων NUXT, συγκεκριμένα του CMS UI και του δημόσιου UI. Τα αρχεία μου μοιάζουν κάπως έτσι:

repo
|- shared
|  |- sass
|  |  `- main.sass
|  `- ts
|     `- test.ts
|- public (NUXT project)
|  |- ...
|  |- nuxt.config.js
|  `- tsconfig.json
`- cms (NUXT project)

Έχω ορίσει alias για το webpack και css στο nuxt.config.js όπως εξής:

css: ['Shared/sass/main.sass'],
build: {
  extend(config, ctx) {
    config.resolve = config.resolve || {}
    config.resolve.alias = config.resolve.alias || {}
    config.resolve.alias.Shared = path.resolve(__dirname, '../shared')
  }
}

καθώς και τη διαδρομή TypeScript στο tsconfig.json:

"paths": {
  "~/*": [
    "./*"
  ],
  "@/*": [
    "./*"
  ],
  "Shared/*": [
     "../shared/*"
  ]
},

Ωστόσο, όταν προσπαθώ πραγματικά να εκτελέσω nuxt ή import {test} from 'Shared/ts/test', φαίνεται ότι δεν μπορούν να επιλύσουν τα μονοπάτια.

Σφάλμα CSS:

 ERROR  Could not compile template xxx\\repo\\public\\node_modules\\@nuxt\\vue-app\\template\\App.js: Cannot resolve "Shared/sass/main.sass" from "xxx\repo\public\Shared\sass\main.sass"

Σφάλμα Typescript:

 ERROR  Failed to compile with 2 errors                                                                                                       friendly-errors 22:16:27

error                                                                                                                                         friendly-errors 22:16:27
                                                                                                                                   friendly-errors 22:16:27
      TS18002: The 'files' list in config file 'tsconfig.json' is empty.
                                                                                                                                              friendly-errors 22:16:27
 @ ./node_modules/babel-loader/lib??ref--2-0!./node_modules/vue-loader/lib??vue-loader-options!./pages/index.vue?vue&type=script&lang=js& 42:0-37 50:7-11
 @ ./pages/index.vue?vue&type=script&lang=js&
 @ ./pages/index.vue
 @ ./.nuxt/router.js
 @ ./.nuxt/index.js
 @ ./.nuxt/client.js
 @ multi eventsource-polyfill webpack-hot-middleware/client?reload=true&timeout=30000&ansiColors=&overlayStyles=&name=client&path=/__webpack_hmr/client ./.nuxt/client.js

Παρακαλώ σημειώστε ότι όταν προσπαθείτε να εισάγετε .ts μέσα στο έργο nuxt, δεν υπάρχει αυτό το σφάλμα.

Ξέρει κανείς πώς να μοιράζεται κώδικα μεταξύ έργων nuxt κάτω από ένα ενοποιημένο αποθετήριο;

Απάντηση #1

Έτσι, η λύση μου ήταν να χρησιμοποιήσω το Lerna για διαχείριση. Δημιουργούσε συνδέσμους (symlinks) μέσα στο node_modules για διαχείριση, αλλά αυτό από μόνο του δεν λύνει το πρόβλημα με τις εισαγωγές σε JS και TS.

Για το JS, πρέπει να οριστεί ένα alias στο webpack στη θέση στο node_modules. Η επίλυση για symlinks πρέπει επίσης να απενεργοποιηθεί για το webpack, διαφορετικά θα προκύψουν προβλήματα στο TS.

Γενική σημείωση είναι ότι το import xxx from ''@ui/shared/xxx'' απέτυχε για μένα κατά την αλλαγή διαδρομής στην πλευρά του πελάτη αλλά όχι κατά την αλλαγή URL του προγράμματος περιήγησης, πρέπει να χρησιμοποιηθεί import xxx from 'Shared/xxx'. Δεν ξέρω γιατί, οπότε αν ξέρετε, παρακαλώ γράψτε ένα σχόλιο.

nuxt.config.ts

  // ...
  build: {
    /*
     ** You can extend webpack config here
     */
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    extend (config, ctx) {
      config.resolve = config.resolve || {}
      config.resolve.symlinks = false
      config.resolve.alias = config.resolve.alias || {}
      config.resolve.alias.Shared = '@ui/shared'
    }
  }
  // ...