Talk is cheap. Show me your code

Svelte 迷途求索(一) —— 构建第一个 Svelte 应用

Svelte 是一个全新的响应式框架,在开发体验上比较接近 Vue,具体的介绍可以参考尤雨溪大佬的评价

 

一、创建应用

Svelte 提供了模板项目,可以通过 degit 拉取到本地

npx degit sveltejs/template <project-name>

拉取项目默认使用的是 js,如果想用 ts 可以在项目根目录下执行:

node scripts/setupTypeScript.js

安装依赖,并启动项目

npm install
npm run dev

然后在浏览器中打开 http://localhost:5000/ 就能访问对应的页面

如果需要修改端口号,可以在 package.json 中的启动命令里修改环境变量 PORT

"scripts": {
  "dev": "PORT=4000 rollup -c -w",
},

由于 Svelte 的作者也是 rollup 的作者,所以默认模板使用的是 rollup 打包

如果想使用 vite, 可以使用 vite-plugin-svelte

 

 

二、在组件中使用 less

模板项目本身不携带任何插件,如果需要在 svelte 组件中写 less,需要安装相关的依赖:

npm install svelte-preprocess-less less -D

然后在 rollup.config.js 中添加相关的配置:

// 模板项目会自带 svelte-preprocess, 如果没有, 可以手动安装
import sveltePreprocess from 'svelte-preprocess';
import { less as svelteLess } from 'svelte-preprocess-less';
 
export default {
  plugins: [
    svelte({
      preprocess: sveltePreprocess({
        style: svelteLess(),
      }),
    }),
  ],
};

然后在组件中的 <style> 标签添加 lang="less"

有个细节需要注意: 每个 .svelte 文件中 <style> 标签内的样式相互独立,就像 Vue 中的 <style scoped>

比如下面的两个组件:

 最终渲染的结果,只有组件A的 title 样式生效

再看看渲染之后 DOM 结构,就会发现具有 <style> 标签的组件,会携带额外的 class: svelte-hash

最终生成的样式表也是这样的:

 那么应该如何处理公共样式呢?请往下看~

 

 

三、完善 rollup.config.js

1. 处理 import 引入的 less 文件

首先安装 rollup 插件 

npm install rollup-plugin-less -D

然后在 rollup.config.js 中的 plugins 加入新的配置:

import less from 'rollup-plugin-less';

export default {
  plugins: [
    less({ 
      ooutput: 'public/build/bundle.css',
    }),
  ],
};

如果项目中使用了 rollup-plugin-css-only,  现在就可以删掉了

将 less 配置直接替换掉原有的 css 配置即可


这样就能直接编写 .less 文件, 然后在 main.js 中引入,从而解决上面提到的公共样式问题

 


 

2. 配置路径别名

路径别名可以解决一些很累赘的相对路径。首先安装依赖

npm install @rollup/plugin-alias -D

然后修改  rollup.config.js 配置

import path from 'path';
import alias from '@rollup/plugin-alias';

const projectRootDir = path.resolve(__dirname);

export default {
  plugins: [
    alias({
      entries: [
        {
          find: '@',
          replacement: path.resolve(projectRootDir, 'src')
        }
      ],
    }),
  ],
};

使用别名之后,上面引入 style/index.less 的相对路径就可以改成:

 

 

四、打包构建

可以直接使用 build 命令进行打包

npm run build

打包之后会按照 rollup.config.js 中的输出路径 output.file 生成目录

在模板项目 sveltejs/template 中,输出路径是 public,所以打包之后的整个 public 就是一个完成的项目

 

 

五、更多模板

以上内容都是基于 sveltejs/template 这个官方应用模板进行开发,这是一个“纯净版”项目

除此之外,在 svelte 的官方社区有很多开发者提交的模板项目

如果你更习惯使用 webpack,也可以尝试 template-webpack

如果你是一名成熟的 svelte 开发者,想开发一个 svelte 组件库,可以使用 component-template

或者你需要一个比较完整且成熟的项目模板,可以考虑 svelte-commerce

这些模板都可以使用 degit clone

npx degit <github-repository> <project-name>

根据需求构建合适的项目,然后就可以起飞了~

 

posted @ 2022-01-12 18:38  Wise.Wrong  阅读(1735)  评论(0编辑  收藏  举报