How to Setup Node.js with TypeScript in 2023

Поділитися
Вставка
  • Опубліковано 28 лис 2022
  • Learn how to setup Node.js with TypeScript while supporting native ES modules. Use the new NodeNext option to easily interop between CommonJS and ES modules in the same project.
    Full Lesson and Source Code fireship.io/lessons/typescrip...

КОМЕНТАРІ • 454

  • @chenlim2165
    @chenlim2165 Рік тому +277

    Thanks for this! Setting up a new Node project in 2023 is:
    1 hour setting up the build environment
    1 hour setting up linting
    1 hour getting webpack to work
    1 more hour optimizing everything
    3 hours researching Deno / Bun / Vite, then deciding it's not worth it
    1 hour wondering if you're better off with plain JS
    1 hour remembering what you wanted to build

    • @mucookul
      @mucookul Рік тому +4

      That’s exactly why I skip half of that stuff

    • @edoardoschnell
      @edoardoschnell Рік тому +7

      How is vite not worth it? 90% of use cases is just install boom works

    • @-rate6326
      @-rate6326 Рік тому +2

      Ask c++ Devs

    • @kollpotato
      @kollpotato 9 місяців тому +4

      Just do bun init

    • @JC-fd8ho
      @JC-fd8ho 7 місяців тому

      about what ?@@-rate6326

  • @iatheman
    @iatheman Рік тому +581

    This guy is always reminding me why I
    1. Hate the JS ecosystem with a passion
    2. Admire the JS developers that maintain their sanity and build stuff with it

    • @Caborrrl
      @Caborrrl Рік тому +84

      Requiring the .js extension from TS was the most stupid TS idea in long time.

    • @thekwoka4707
      @thekwoka4707 Рік тому +11

      @@Caborrrl well, it's technically the spec.
      The TS system is very "what the spec is".
      Having unsuffixed imports is not valid js.

    • @filipmajetic1174
      @filipmajetic1174 Рік тому

      @@Caborrrl there's a compiler option "esModuleInterop" that fixes it

    • @Caborrrl
      @Caborrrl Рік тому +4

      @@filipmajetic1174 No. The esModulelnterop is not for that or anything related to that. Wtf?

    • @iatheman
      @iatheman Рік тому

      @@shapelessed Just realized my handle is the weird generated one. But I've been there with another stack, same pain.

  • @ukaszzbrozek6470
    @ukaszzbrozek6470 Рік тому +125

    Why we need to target .js files when they extensions are .ts ? It is so confusing.

    • @stxnw
      @stxnw Рік тому +79

      You don't. Jeff just doesn't know about the esModuleInterop option on TypeScript.

    • @18.j
      @18.j Рік тому +8

      When you compile you run the .js file and you target the other .js files, typescript won't change your import to ts so you declare it with .js that's why...

    • @stxnw
      @stxnw Рік тому +7

      @@18.j Wrong

    • @cyrus01337
      @cyrus01337 Рік тому

      @@stxnw How does TS handle this then?

    • @paoloose
      @paoloose Рік тому +3

      ​@@stxnw when I dont specify the files extension, "esModuleInterop" set to true gives me:
      Relative import paths need explicit file extensions in EcmaScript imports when '--moduleResolution' is 'node16' or 'nodenext'
      When using .ts files, The vscode hints say:
      "An import path can only end with a '.ts' extension when 'allowImportingTsExtensions' is enabled.ts(5097)"
      When I enable it, all errors are gone, but the typescript compiler throws:
      "error TS5023: Unknown compiler option 'allowImportingTsExtensions'."
      So weird.

  • @schmidtdisturbr
    @schmidtdisturbr Рік тому +5

    A thousand thank-yous for this! I wish this video were linked in the TypeScript official getting started docs. As an infrequent JavaScript developer starting to dig into the TypeScript ecosystem, the legacy module situation is a huge stumbling block to get past. Love your straightforward presentation.

  • @ivanb493
    @ivanb493 Рік тому +180

    I feel like it might be a good idea to cover the ts-node package next time which is nice during development

    • @lsudo
      @lsudo Рік тому +3

      @@vaaski that's basically react my friend

    • @CTSSTC
      @CTSSTC Рік тому +1

      @@vaaski tsx is for react components; we don't need that additional weight here if you're just trying to write some non-frontend code.

    • @CTSSTC
      @CTSSTC Рік тому

      @@alanbixby I tend to lean into ts-node, but now it's sounding like a nightmare yet again lol; I'll have to look into esbuild kit I guess lol; yet another tool :RIP:
      They used to say to never use ts-node for production, then you could; all the answers are an answer in one point in time and then never again down the road as they become the "wrong answer" lol
      I'm just glad to have node 18 here and the older versions dying off 🎉
      It's all still a pain though.

    • @That_Darned_S
      @That_Darned_S Рік тому +1

      @@lsudo No, we're not talking about react or jsx/tsx. Tsx is an npm package, does the same thing as ts-node but it's newer.

    • @danielegvi
      @danielegvi Рік тому +2

      @@lsudo tsx is a CLI program, short for typescript execute. it uses esbuild to transpile all imports to js in memory on demand really fast. it also supports jsx/tsx the language extension, which is a bit confusing at first.

  • @bellabianchi7667
    @bellabianchi7667 Рік тому +2

    OMG I literally sat there with this exact issue an hour ago and couldn’t resolve it and this appears in my subscriptions - THANK YOU!!

  • @zyrenth
    @zyrenth Рік тому +6

    Amazing tutorial, It's definitely a good tutorial for beginners, keep up the good work!

  • @danish7335
    @danish7335 14 днів тому

    you don't know how much you helped me.. thanks mate

  • @TheBeastDispenser
    @TheBeastDispenser Рік тому +3

    Thank you! This could not come at a better time. For the life of me I could not get TypeScript working with my GraphQL setup but your review of the tsconfig files cleared up my confusion. My main issue was needing to add the .js file extensions to the imports.

  • @shobhitsingh6271
    @shobhitsingh6271 3 місяці тому

    Million likes for this video! I spent the entire day debugging until I stumbled upon your video. Turns out, the issue was that I was importing a common JS package without specifying {"type":"module"} in the package.json. Thank you so much! ❤❤❤❤❤

  • @MisterNorthernCanuck
    @MisterNorthernCanuck Рік тому

    I spent 3 hours on fixing this. Thank you so much.

  • @HackSoft
    @HackSoft Рік тому

    Kudos for the concise & resourceful video 🙌

  • @thepisewigeon
    @thepisewigeon Рік тому +1

    The video I never knew I needed, thanks Jeff :)

  • @dubble_cuppachino
    @dubble_cuppachino Рік тому +19

    The module field is pretty much abandoned. It's only really used by bundlers. The correct way to tell node how to import your code is to use the "files" and “exports” fields. Not trying to sound like a stackoverflow comment, just wanted to share a thing I picked up after diving into all this stuff recently. Excited to watch the rest, I love your content!

  • @user-sq6us6jl5h
    @user-sq6us6jl5h 9 місяців тому

    Exactly what I needed . Perfect video!

  • @CTSSTC
    @CTSSTC Рік тому +49

    Every year for advent of code, I spend a majority of my time configuring my baseline JS/TS environment rather than working on the coding problems, which is fun because I get to see how much things have changed just like this video hits on 😆
    Edit: I'm excited to see this full course and how it evolves ;D 🎉

    • @zettca
      @zettca Рік тому +1

      Change to Deno. You'll get TS, top-level async, ESM, external modules, linting/formatting with 0 config

    • @codeman99-dev
      @codeman99-dev Рік тому +1

      @@zettca No. I can't use Deno at work. I wouldn't learn Zig right now for the same reason. Not worth it. I need to know the node ecosystem.

    • @zettca
      @zettca Рік тому +3

      @@codeman99-dev we're talking about AoC, not work.

    • @codeman99-dev
      @codeman99-dev Рік тому +1

      @@zettca Yes. It is a great opportunity to catch up and learn what is new. It is hard to do that if you jump ship.

    • @marvinxu2950
      @marvinxu2950 7 місяців тому

      @@zettca Just curious, what is AoC?

  • @flatmapper
    @flatmapper 11 місяців тому

    Love it! Looking forward to watching your full course. But please do it for experienced developers too

  • @codewithguillaume
    @codewithguillaume Рік тому

    Yess!!!! I was hoping to see this video one day on your channel :)

  • @d-landjs
    @d-landjs 11 місяців тому

    Excellent tutorial!

  • @voychoi9923
    @voychoi9923 Рік тому

    Great content as always

  • @aunimhassan7465
    @aunimhassan7465 Рік тому

    life saver video

  • @srinivasnahak3473
    @srinivasnahak3473 8 місяців тому

    You're a magician for sure!!

  • @joseandkris
    @joseandkris 9 місяців тому

    This is amazing. Thank you :)

  • @fizzdev
    @fizzdev Рік тому +11

    top notch video, can't wait for the 2024 guide

    • @nithinrajendran3091
      @nithinrajendran3091 Місяць тому

      Did the 2024 guide drop yet? bro left us hanging..

    • @fizzdev
      @fizzdev Місяць тому

      @@nithinrajendran3091 sadly not.. we'll have to wait a few more months

  • @phaZZi6461
    @phaZZi6461 10 місяців тому

    i was here for the module thing, thanks

  • @user-fc3us4vb3k
    @user-fc3us4vb3k 11 місяців тому

    Thank you so much!

  • @ThePotatoChronicler
    @ThePotatoChronicler Рік тому +2

    Deno NPM compatibility is nearly there! We're so close. Most libraries just work OOTB already. I am running from node with the speed of light my man, at least for my personal projects

  • @Novacification
    @Novacification Місяць тому

    An hour looking for a minimal typescript setup with clear explanations. I should have known to come here immediately.

  • @danieldosen5260
    @danieldosen5260 Рік тому

    Great use of

  • @Grim_Nerd
    @Grim_Nerd Рік тому +2

    I always find myself having a mini heart attack when watching your videos because you'll occasionally hear a baby crying in the background and I ALWAYS think it's my baby. I'm literally home alone right now and still paused the video to listen out for him crying :')

  • @NoPudieronConGuevara
    @NoPudieronConGuevara Рік тому +3

    It's truly a peculiar experience see how this channel's owner is gradually descending into madness by the hand of web technologies mostly.
    I just can't look away... keep the hard work

  • @michaelmenard8614
    @michaelmenard8614 Рік тому +3

    Awesome video! Any chance there is a pt. 2 coming with jest, eslint, prettier, and husky?

  • @user-ck6yl6qb2g
    @user-ck6yl6qb2g Рік тому

    Excellent!

  • @riddixdan5572
    @riddixdan5572 Рік тому +16

    I'm still confused as to why we need to specify file extention when we import. Couldn't node/TS resolve it itself based on the actual file it is importing?

    • @mcvgs1780
      @mcvgs1780 Рік тому

      I kind of remember Ryan Dahl spoke about this being needlessly complex to implement and (not so sure if I remember this right) hogs resources. If he were given a chance to do Node all over again he would not do it.

    • @dusliangames
      @dusliangames Рік тому +3

      I just use tsc-alias to fix the import file extension after compiling. It's easier and cleaner. And handles the path aliasing. I would recommend using nodenext for moduleresolution, but for the module option to use esnext or commonjs

  • @stefankracht
    @stefankracht Рік тому

    Good timing on that video, since advent of code is around the corner ❤

  • @zvrk
    @zvrk Рік тому +6

    For those that want nodemon to watch over file changes:
    add
    "ts-node": {
    "esm": true
    }
    to tsconfig.json
    And if your shell complains like mine did use ( npx nodemon src/index.ts ) this should work
    Also add ts-node globally with ( npm i -g ts-node ) really not sure if this is needed but I did it anyway

  • @nithinraj1428
    @nithinraj1428 Рік тому

    Thank You

  • @nicholaskoffler294
    @nicholaskoffler294 Рік тому

    looking forward to that typescript course

  • @radandevist4168
    @radandevist4168 Рік тому

    hahaha funny, I just wrote a post about swc setup on backend project as well too on my blog a few days ago😅. Nice timing.

  • @Ma1ne2
    @Ma1ne2 Рік тому +2

    Looking forward to part two if this video in a month when all of this changed again :D

  • @steveanthonyluzquinosagama7450

    That's exactly why I created typescript-project-generator. It will handle all the configs for using TS with Node.js. Give it a try :)

  • @kklowd
    @kklowd Рік тому

    Bruh how did you know I was setting up a project to with both esm and cjs you really are a wizard 👀

  • @Alex-lt4kr
    @Alex-lt4kr 6 місяців тому

    Thank you, i was struggling with the tsconfig trying to get the top level await feature working

  • @Zwiebelgian
    @Zwiebelgian Рік тому +207

    Deno now supports npm (atleast that is what their propaganda says) so now may be a good time to switch

    • @brucewayne2480
      @brucewayne2480 Рік тому +6

      Why ? I just want to know what will you gain ?

    • @Zwiebelgian
      @Zwiebelgian Рік тому +53

      @@brucewayne2480 Built-in Typescript support, better speed, cleaner directories. I don‘t actually know, I am not a backend developer

    • @brucewayne2480
      @brucewayne2480 Рік тому +5

      @@Zwiebelgian it's not a lot of work to setup a typescript project , cleaner directories I'm not seeing any problem, speed not sure , I've not seen any benchmarking

    • @jakob7116
      @jakob7116 Рік тому +39

      @@Zwiebelgian yeah, it also has better apis under the Deno. namespace and a std library. You also get less config files, lots of built in stuff like linter so you don’t have to do that yourself, more secure, faster http server, better browser compatibility, the apis mostly use promises (and sync versions) instead of callbacks, you can run code directly from a url, even Ts code and so on
      The npm support doesn’t work on all packages perfectly just yet but soon:tm:

    • @Dominik-K
      @Dominik-K Рік тому +8

      For me personally the sandboxing capabilities are nice

  • @vinixqasim
    @vinixqasim 5 місяців тому

    thank you

  • @0brine
    @0brine Рік тому +1

    Lol i needed that exactly 2 days ago xD

  • @rign_
    @rign_ Рік тому +1

    I need to work with pure javascript to get CommonJS working, because of dynamically use the code and re-import it on runtime is such a blessing as well a curse. But for my project and personal works, it's perfectly fine.

  • @kalebercanbrack8857
    @kalebercanbrack8857 Рік тому +2

    Just yesterday I was dealing with something similar with Fastify and Typescript. I wanted to be using ESM, and went through the whole troubleshooting process to figure out the right tsconfig settings, but due to the way a lot of Fastify packages were exporting their types it broke being able to import the default export from it. I don't know the specifics, but it was just super annoying that this glorified linter was causing such an obnoxious bug for code that worked fine without it.
    However, Typescript in Deno is a beautiful experience. Largely I think because you don't have to worry about commonJS. Makes me wonder if as Deno gets more popular, the TS Node people will move over to it

    • @vaultofmyths
      @vaultofmyths 6 місяців тому

      Except deno breaks your code in ways you can't imagine because of their weird engine

  • @Zagoorland
    @Zagoorland Рік тому +3

    You should make a movie about package managers, only few people know about PNPM for example, but for now it's the fastest and most space efficient solution!

    • @LarsRyeJeppesen
      @LarsRyeJeppesen Рік тому

      And messy. The amount of time I have spent resolving fcked up symlinks is countless

  • @AnweshAdhikari
    @AnweshAdhikari Рік тому

    Time travel is real! Jeff is one month ahead of us!😂❤

  • @Novacification
    @Novacification Рік тому

    Could you go over some scenarios for building and publishing. For instance, I'm creating a base server implementation (basically an express wrapper with auth middleware) and I would like to publish it to a local npm registry (Verdaccio).
    It publishes everything, not just the dist folder, and I'm not sure how to handle dependencies.
    I have some issues with importing the server package as well, needing to do a second deconstruction of the default export for the dependency.
    A good up to date minimal setup for building and publishing would be really cool! Something with build to dist, publish from dist and importing the package somewhere (maybe even with import instead of require)

  • @shaded4438
    @shaded4438 7 місяців тому

    the moth really cheered me up i cant lie

  • @resourcelookup8678
    @resourcelookup8678 Рік тому +1

    Super

  • @bensas42
    @bensas42 Рік тому

    I had to do this last week haha

  • @alecdorasandler6690
    @alecdorasandler6690 2 місяці тому +1

    Thanks a shit ton for this! I wasted so much time fixing the imports with .ts ext.

  • @SamyarBorder
    @SamyarBorder Рік тому

    evey once in a while i come back and watch this video

  • @wlockuz4467
    @wlockuz4467 Рік тому +1

    Is there an easy way to emit non-js files from src? For instance images or csv.
    I hate using 10 different packages to copy the files after compiling or making a complicated build system for a very simple project.

  • @Steve-Richter
    @Steve-Richter Рік тому

    was hoping you would cover how to run the equivalent of nodemon when a change is made to the typescript source code.

  • @GuildOfCalamity
    @GuildOfCalamity 5 місяців тому

    Great video.
    This reminded me of the reason I don't like web dev... too many moving parts just to get a simple webpage to run.

  • @abhaynath5833
    @abhaynath5833 Рік тому

    Madness....... ?
    THIS IS JavaScript ecosystem 🔥🔥🔥🔥🔥🔥

  • @dusliangames
    @dusliangames Рік тому +30

    Importing a js file in typescript that doesn't exist on the file system is really confusing and simply weird. It's way better to use a tool like tsc-alias to fix the imports as a compilation step instead of having to change every import of every source file in every project.

    • @vikingthedude
      @vikingthedude Рік тому +1

      Yeah I don’t like it

    • @adam-user
      @adam-user Рік тому +1

      Is there a way to resolve this that works both during compile time and in VSCode?

  • @Mauro-K
    @Mauro-K Рік тому

    I like the video, I hated the topic, but it was good content

  • @VideoBunt
    @VideoBunt Рік тому +5

    1) ts-node + nodemon could be very helpful
    2) npm i tsconfig@ for certain node version could be helpful, just extends it

    • @stxnw
      @stxnw Рік тому

      no. ts-node is trash

    • @VideoBunt
      @VideoBunt Рік тому

      @@stxnw why? And what can replace it?

    • @stxnw
      @stxnw Рік тому

      @@VideoBunt swc-node

    • @LarsRyeJeppesen
      @LarsRyeJeppesen Рік тому

      ts-node is horrible. Do not use it please

    • @LarsRyeJeppesen
      @LarsRyeJeppesen Рік тому

      @@VideoBunt tsup (esbuild) in watch mode

  • @ggorg0
    @ggorg0 Рік тому +3

    You forgot about strict mode in tsconfig.json!

  • @abdulazeem1880
    @abdulazeem1880 Рік тому

    Please make a video on pr-commit hooks

  • @himanshukapoor5586
    @himanshukapoor5586 Місяць тому

    "noEmit": true,
    "allowImportingTsExtensions": true,
    adding these two will allow you to import ts files as .ts files only.

  • @xrr-1
    @xrr-1 Рік тому +2

    0:45 javascript at its peak

  • @mmvarma.p
    @mmvarma.p Рік тому +6

    Great video as always. From 3.09 secs to 3.28 secs, your voice sounded different. Is it me or has anyone noticed it? R u well bro. Please stay safe and sound. Looking forward to your next video.

  • @Alex-hk3hr
    @Alex-hk3hr Рік тому +1

    Thanks for a great tutorial and a perfect argument why not to use JS/TS ; )

  • @rofgar
    @rofgar Рік тому

    Very good guide, amazingly frustrating topic.

  • @salsichalivre5401
    @salsichalivre5401 Рік тому

    Great, I only needed 3 minutes to give up on frontend dev.

  • @xDemorn
    @xDemorn Рік тому +1

    Can you make a tutorial on how to host a node app on IIS?

  • @Dysfunctional704
    @Dysfunctional704 Рік тому +1

    Can you make a video on the T3 Stack from Theo?

  • @anubhavbansal8922
    @anubhavbansal8922 4 місяці тому

    which icon pack you are using for icons in side nav ?

  • @thepowerhat
    @thepowerhat Рік тому +14

    For developing nodejs backend, I generally use babel with watch mode and nodemon to have very fast server restart on file save. I'll check this out but I'll probably still prefer sticking with a faster transpiler than tsc

    • @double-agent-ly
      @double-agent-ly Рік тому +5

      why use babel when u have vite or even the newer tool, rome

    • @thepowerhat
      @thepowerhat Рік тому +5

      @@double-agent-ly Vite for backend? Hmm

    • @fred.flintstone4099
      @fred.flintstone4099 Рік тому +1

      For developing frontend I use Vite for very fast hot reload on file save.

    • @shubitoxX
      @shubitoxX Рік тому +1

      Babel is not fast

    • @thepowerhat
      @thepowerhat Рік тому +1

      ​@@shubitoxXSure faster than tsc, because it just ignores the types, it doesn't type validate the AST like tsc does..

  • @marna_li
    @marna_li Рік тому

    I went through this a couple of months ago. But there might be some starter templates. At least there should be one.

  • @SirBalls
    @SirBalls Рік тому +3

    As someone in 2023, I can confirm this is how you setup Node.js with TypeScript

    • @SirBalls
      @SirBalls Рік тому

      @@minorikoaki No, other way around

    • @LarsRyeJeppesen
      @LarsRyeJeppesen Рік тому

      No no no, don't use tsc, and don't use ts-node.

    • @SirBalls
      @SirBalls Рік тому

      @@LarsRyeJeppesen Sorry, in 2023, we still use tsc for some reason... I don't make the rules

  • @twentyeightO1
    @twentyeightO1 Рік тому +4

    The ritual of harakiri is easier than this.

  • @kumekster
    @kumekster Рік тому

    Maybe quick guide here on how to set eslint?

  •  Рік тому +3

    Don't forget to add the "--enable-source-maps" flag when running your compiled code with node, otherwise the sourcemaps will be ignored.

  • @irun_mon
    @irun_mon Рік тому

    I just started learning coding (JS) and i found these channels of yours, I usually just watch to see what will I learn in the future but damn this one looks complicated, you do this everytime to build a project??

    • @niton6474
      @niton6474 Рік тому

      That's the neat part: it's even worse. Depending on the frameworks, libraries that you use you might need to use a completely different tool chain. Or maybe you need to include a frontend framework - much luck without the init of that framework.
      But! If you just use a "plain" server side express app this setup should be fine every time

  • @themarksmith
    @themarksmith Рік тому +1

    How about a demo on how to make a basic PWA?

  • @developer_hadi
    @developer_hadi Рік тому

    Cool

  • @LarsRyeJeppesen
    @LarsRyeJeppesen Рік тому +1

    tsc? What about Turbo, EsBuild etc? Why use npm when we have pnpm?

  • @grantdoyle1259
    @grantdoyle1259 Рік тому +4

    2023? Getting a little ahead of ourselves aren't we?

  • @jacops419
    @jacops419 Рік тому

    tsc --init works most of the time aswell

  • @jaroslavhuss7813
    @jaroslavhuss7813 Рік тому +1

    Nah, this is one of the reasons why I use Nest.js - TypeScript by default, no hassle, no cry - just awesome architecture, typescript and more time for playing Witcher 3 after the work is done.

  • @Disorrder
    @Disorrder Рік тому +1

    Or simply install nest or another boilerplate starter

  • @eestpavel
    @eestpavel Рік тому +2

    Lately I found myself better setting vite-node rather than trying to set all that experimental flags to run my code with modern day devfeatures

  • @crystalcortexx
    @crystalcortexx 8 місяців тому

    Hello, I am using node JS and I am trying to use ECMA script with both js and TS files. I have set in my package.json "type: module", but when it fails to build with the output: "unknown file extension TS"

  • @grzegorzt3755
    @grzegorzt3755 Рік тому

    but if you import module with '.js' postfix - don't you then the ability for type checking by typescript, cause imported code is treated as js code?

  • @michalbilinski4168
    @michalbilinski4168 Рік тому

    The moment when you insert a voice over from another recording session x)

  • @martinzen
    @martinzen Рік тому

    I have trouble deciding if the best thing about your videos are the software parts of the meme parts...

  • @ertagon
    @ertagon Рік тому +1

    Do Babel next.

  • @djibrilmugisho5874
    @djibrilmugisho5874 Рік тому

    I think you should add the watch option for watching new changes instead of compiling everything manualy

  • @tlotliotllotlleng2380
    @tlotliotllotlleng2380 Рік тому

    This is going to be complex plus .js for ts ????

  • @Roman-of9pl
    @Roman-of9pl Рік тому

    Every time someone is sharing their project setup I recall that scene from American Psycho.

  • @nomadswe
    @nomadswe Рік тому

    Do the course in strict:true mode pls.

  • @xoutaku7600
    @xoutaku7600 Рік тому +1

    get well bro

  • @alejosky
    @alejosky Рік тому

    I just noticed that you still use NPM... any thoughts on PNPM?