What are the differences between in .fsx, .fsi and .fs file in F#?

Solution 1:

.fsx is for individual files intended to run as a script. In particular, in an .fsx file you can use things like #r "Foo.dll" to dynamically load a library and #load "Foo.fsx" to load another script file.
[Edit: and starting with .NET 5, #r "nuget: FooBar" to load a NuGet package.]

.fs is for source files compiled as part of a project.

.fsi is for signature files, they are optional and describe the API of a corresponding .fs file. More detail here.