中国人——特别是汉族人,理应坚持广泛、规范地使用汉语。凡非必要之情形不说外国话、不用外国字。此乃天经地义!然则每当必要,亦不排斥采用外国之语言。不妨 博世界之学问,养中国之精神 。
本人亦支持少数民族坚持采用自己民族的传统语言。仍须强调,凡中国人,皆应会用汉语、积极使用汉语,此乃中华各民族之大一统之必由。
- NPM 包名
- 作者
- 南昌吴乐川 
本工具之主体是一个函数,其将一个旧有字符串转换成新字符串,并返回该新字符串。
- 
旧有字符串由外界给出,其内容视为一个 Vuejs 2.x 版的 .vue文件之内容。且:- <script>代码块可能采用 TypeScript 或 JavaScript 语言编写而成;
- <template>代码块可能采用 Pug 或 HTML 语言编写而成;
- 诸 <style>代码块可能采用 Stylus 、Sass(含 SCSS )或 LESS 语言编写;
- 可能包含零个、一个或若干自定义内容块。
 
- 
本工具返回的新字符串,其内容仍视为一个 .vue文件之内容。默认情况下:- 若输入的 <script>代码块系采用 TypeScript 语言编写,则输出的<script>中的代码已编译成 JavaScript 语言之代码。
- 若输入的 <template>代码块系采用 Pug 语言编写,则输出的<template>中的代码已编译成类 HTML 代码。
- 所有 <style>代码块中的所有代码已编译成标准的 CSS 代码。
- 凡自定义内容块,原封不动。
 
- 若输入的 
简而言之,本工具处理一个 .vue 文件之内容全文(字符串),得到一个全新的 .vue 文件内容之全文(字符串)。
既然我们已经写就了 .vue 文件,为何还要产出新的 .vue 文件呢? 换句话说,我们可能遇到怎样的问题或困难呢?
设想我们采用 Vuejs 框架编写【部件】(外国话所谓 “component”)或部件库时,有以下可能的情形:
- 我们多数人喜爱采取 .vue文件(即【单文件部件】)之形式。
- 我们可能会选择 TypeScript 语言而非 JavaScript 语言来编写 .vue文件中<script>标签之内容。
- 我们并非要将这些部件或部件库编译打包成单一的【网页应用】(外国话所谓 “Web App”),而是要发布到云端(典型的如 npmjs.org)供其他项目调用。
如果上述三个条件同时成立,则在其他项目要引用我们的这类部件或部件库时,就可能遭遇问题。 这是因为:
- 已知我们的工具的代码是 TypeScript 语言编写的;
- 其他人在其项目中则可能采用纯 JavaScript 而非 TypeScript 语言编写代码。且可能其并未配置与兼容 TypeScript 代码相关的复杂的工具链。
故其项目无法直接利用我们采用 TypeScript 语言编写的 .vue 部件。他们的项目希望利用纯用 JavaScript 语言编写之工具。
解决这个问题有两个方案,如下:
- 
不厌其烦地指导其他项目做好令 JavaScript 代码兼容 TypeScript 语法的配置。这个方案很不友好。况且我本人也没有仔细尝试,可行与否未有定论。 
- 
每当我们采用 TypeScript 语言编写独立的 Vue 部件后,在发布这些由 TypeScript 语言编写的代码时,一并发布一套 JavaScript 语言之版本的代码。即,我们在发布时, TypeScript 和 JavaScript 并举。 由此,不论其他项目采用 TypeScript 还是 JavaScript 语言,均可使用我们编写的 .vue部件无虞。
如果你采取第 2 方案,那么需要一个工具来帮助你做代码转换。而本工具许是阁下不二之选。
顺便指出,本工具名称为
vue2-sfc-from-typescript-to-javascript,易给人造成“本工具仅处理<script>代码块”的错误印象。实则本工具默认也会将 Stylus 、Sass 、LESS 转换成标准的 CSS ;并将<template>中采用 Pug 语言编写的代码编译成类 HTML 代码。所有代码转换动作默认均是开启的,且均可通过选项关闭。若某转换开关关闭,则对应语种之代码将原封不动输出。
本工具接受的输入是一个字符串,但该字符串并非 .vue 文件路径之字符串,而是 .vue 文件之内容之字符串。因此,读取文件之操作须另行编写。如此设计,自然是为了令本工具拥有更佳的通用性。
npm  i  @wulechuan/vue2-sfc-from-typescript-to-javascript注意下方示例代码中的 处理一个Vue2的单文件部件的内容 函数。
另可参阅本项目代码库中的 ./测试集/index.js。
const tsconfig = {
    compilerOptions: {
        target: 'ES2015',
        module: 'ESNext',
        noImplicitAny: true,
        removeComments: false,
        preserveConstEnums: true,
        sourceMap: false,
    },
}
const 配置项总集之公共部分 = {
    tsconfig,
}
转换单个Vue文件(
    './lib/my-cool-component.vue',
    './dist/lib/my-cool-component.js.vue',
    配置项总集之公共部分
)
async function 转换单个Vue文件(原始文件之路径, 输出文件之路径, 配置项总集) {
    const 原始Vue文件之内容包 = await readFile(原始文件之路径, 'utf8')
    const 原始Vue文件之内容全文 = 原始Vue文件之内容包.toString()
    // 下方的 `处理一个Vue2的单文件部件的内容` 即是本工具之唯一接口函数。
    const 得到的新的Vue文件之内容全文 = await 处理一个Vue2的单文件部件的内容(
        原始Vue文件之内容全文,
        {
            ...配置项总集,
            用于命令行消息中的对原内容的扼要描述: '一枚极为闪耀的 Vue 2 部件',
        }
    )
    await writeFile(输出文件之路径, 得到的新的Vue文件之内容全文)
}本工具仅提供唯一的函数作为对外接口,但故意给出汉语、英语两种名称:
- 处理一个Vue2的单文件部件的内容
- transformContentStringOfSingleVueFile
该函数之签名( Signature )如下:
function 处理一个Vue2的单文件部件的内容(
    原始Vue文件之内容全文: string,
    配置项总集?: T_TransformationOptions // 详见下文。
): string
function transformContentStringOfSingleVueFile(
    sourceVueFileContentString: string,
    options?: T_TransformationOptions // 详见下文。
): stringimport type {
    CompilerOptions as 范_TypeScript语言的编译配置项集,
} from 'typescript'
import type {
    Options         as 范_Pug语言的编译配置项集,
} from 'pug'
import type {
    RenderOptions   as 范_CssStylus语言的编译配置项集,
} from 'stylus'
import type {
    Options         as 范_CssSass语言的编译配置项集,
} from 'sass'
import type Less from 'less'
// - - - - - - - - - - - - - - - - - - - - - -
export type T_TransformationOptions = {
    用于命令行消息中的对原内容的扼要描述?: string;
    sourceContentDescriptionName?: string;
    用于产生的Vue文件中各代码块的单级缩进空白?: string | number | null;
    indentation?: string | number | null;
    不应编译TypeScript?: boolean;
    shouldNotTranspileTypescript?: boolean;
    不应编译Pug?: boolean;
    shouldNotCompilePug?: boolean;
    不应编译Stylus?: boolean;
    shouldNotCompileStylus?: boolean;
    不应编译Sass?: boolean;
    shouldNotCompileSass?: boolean;
    不应编译LESS?: boolean;
    shouldNotCompileLESS?: boolean;
    产生的内容中不应包含模板?: boolean;
    shouldNotOutputTemplateTag?: boolean;
    产生的内容中不应包含任何Style标签?: boolean;
    shouldNotOutputAnyStyleTags?: boolean;
    tsconfig?:                   范_TypeScript语言的编译配置项集;
    TypeScript语言的编译配置项集?:  范_TypeScript语言的编译配置项集;
    pug语言的编译配置项集?:         范_Pug语言的编译配置项集;
    pugCompilationOptions?:       范_Pug语言的编译配置项集;
    cssStylus语言的编译配置项集?:   范_CssStylus语言的编译配置项集;
    cssStylusCompilationOptions?: 范_CssStylus语言的编译配置项集;
    cssSass语言的编译配置项集?:     范_CssSass语言的编译配置项集<'sync'>;
    cssSassCompilationOptions?:   范_CssSass语言的编译配置项集<'sync'>;
    cssLESS语言的编译配置项集?:     Less.Options;
    cssLESSCompilationOptions?:   Less.Options;
};其中,
- 
用于命令行消息中的对原内容的扼要描述(sourceContentDescriptionName)是文本(string)。填写该值可令 Nodejs 在控制台输出的信息更明确易懂。如果给出无效值,例如undefined,则本程序退而求其次,采用源.vue内容字符串之哈希值作为其所谓“名称”。
- 
用于产生的Vue文件中各代码块的单级缩进空白(indentation)表达代码缩进时的单级缩进空白采用的文本。不仅可以给出空白字符串,亦可给出大于零的数字值,该数字用于规定单级缩进所需空格(' ')之数量。参阅《@wulechuan/get-valid-indentation-string 的〈应用编程接口〉部分》。
- 
TypeScript语言的编译配置项集(tsconfig)为 TypeScript 语言的标准配置项集。本工具不对该配置项集做任何处理,亦不使用其中任何字段,而是将其直接传递给 TypeScript 的编译程序。
- 
pug语言的编译配置项集(pugCompilationOptions)为 Pug 语言的标准配置项集。本工具不对该配置项集做任何处理,亦不使用其中任何字段,而是将其直接传递给 Pug 的编译程序。见《官方说明》。 
- 
cssStylus语言的编译配置项集(cssStylusCompilationOptions)为 Stylus 语言的标准配置项集。本工具不对该配置项集做任何处理,亦不使用其中任何字段,而是将其直接传递给 Stylus 的编译程序。见《官方说明》。 
- 
cssSass语言的编译配置项集(cssSassCompilationOptions)为 Sass 语言的标准配置项集。本工具不对该配置项集做任何处理,亦不使用其中任何字段,而是将其直接传递给 Sass 的编译程序。见《官方说明》。 
- 
cssLESS语言的编译配置项集(cssLESSCompilationOptions)为 Sass 语言的标准配置项集。本工具不对该配置项集做任何处理,亦不使用其中任何字段,而是将其直接传递给 Sass 的编译程序。见《官方说明》。