当前位置:   article > 正文

Vue 2 组件发布到 npm 的常见问题解决

Vue 2 组件发布到 npm 的常见问题解决

按照 Vue 2 组件打包并发布到 npm 的方法配置项目后,项目在实际开发过程中,随着代码写法的多样性增加而遇到的各种打包问题,本文将予以逐一解决:

本文目录

同时导出多个组件

样式表 import 问题解决

Json 文件 import 问题解决

"@"路径别名无法识别的问题

??, ?. 等运算符无法编译的问题解决

jsx 语法的支持

支持 TypeScript


同时导出多个组件

修改 wrapper.js 即可

  1. import component1 from './components/MyComponent1.vue';
  2. import component2 from './components/MyComponent2.vue';
  3. export function install(Vue) {
  4. if (install.installed) return;
  5. install.installed = true;
  6. Vue.component('MyComponent1', component1);
  7. Vue.component('MyComponent2', component2);
  8. }
  9. ...
  10. // export default component;
  11. export {
  12. component1 as MyComponent1,
  13. component2 as MyComponent2,
  14. }

样式表 import 问题解决

  1. <script>
  2. import "../scss/common.scss";
  3. ...
  4. </script>

如上代码所示,如果在 .vue 页面的 script 标签间 import 样式表(或者在 .js 文件中 import 样式表),会在打包时报错,如下

关键报错信息:SyntaxError: Unexpected token

针对 .scss, .sass 和 .css 样式表的解决办法如下

安装 rollup-plugin-scss 插件

npm i rollup-plugin-scss -D

修改 rollup.config

  1. ...
  2. import scss from 'rollup-plugin-scss';
  3. export default {
  4. ...
  5. plugins: [
  6. commonjs(),
  7. scss({ insert: true }),
  8. image(),
  9. ...
  10. ],
  11. };

Json 文件 import 问题解决

  1. <script>
  2. ...
  3. import info from "../data/info.json";
  4. export default {
  5. ...
  6. mounted() {
  7. console.log("读取 json 文件内容 :>> ", info);
  8. },
  9. };
  10. </script>

如上代码所示,引入 .json 文件会导致打包报错:

关键报错信息:SyntaxError: Unexpected token

解决方法如下

安装 @rollup/plugin-json 插件

npm i @rollup/plugin-json -D

修改 rollup.config

  1. ...
  2. import json from '@rollup/plugin-json';
  3. export default {
  4. ...
  5. plugins: [
  6. commonjs(),
  7. scss({ insert: true }),
  8. image(),
  9. json(),
  10. ...
  11. ],
  12. };

"@"路径别名无法识别的问题

如下,使用了 Vue 原生支持的 @ 作为路径别名

  1. <script>
  2. import LOGO from "@/assets/logo.png";
  3. import "@/scss/common.scss";
  4. import info from "@/data/info.json";
  5. ...
  6. </script>

但打包时会报警告

关键警告信息:Unresolved dependencies

解决方法如下

安装 @rollup/plugin-alias 插件

npm i @rollup/plugin-alias -D

修改 rollup.config

  1. ...
  2. import { fileURLToPath } from 'url';
  3. import path from 'path';
  4. import alias from '@rollup/plugin-alias';
  5. const __filename = fileURLToPath(import.meta.url);
  6. const __dirname = path.dirname(__filename);
  7. const projectRootDir = path.resolve(__dirname, '..');
  8. export default {
  9. ...
  10. plugins: [
  11. commonjs(),
  12. alias({
  13. entries: [{
  14. find: '@',
  15. replacement: path.resolve(projectRootDir, 'src'),
  16. }]
  17. }),
  18. scss({ insert: true }),
  19. image(),
  20. json(),
  21. ...
  22. ],
  23. };

??, ?. 等运算符无法编译的问题解决

如下,代码中出现空值合并运算符(??)或可选链运算符(?.)时

  1. <script>
  2. ...
  3. export default {
  4. ...
  5. mounted() {
  6. let x;
  7. const y = x ?? 1;
  8. },
  9. };
  10. </script>

出现如下报错

关键报错信息:SyntaxError: Unexpected token

解决此问题,要么把 ?? 和 ?. 的语法替换为其它等效的算法

要么如下所示,把本来所用的 @rollup/plugin-buble 插件替换为 @rollup/plugin-babel 插件

安装 @rollup/plugin-babel 插件

npm i @rollup/plugin-babel -D

修改 rollup.config

  1. ...
  2. import { babel } from '@rollup/plugin-babel';
  3. ...
  4. export default {
  5. ...
  6. plugins: [
  7. ...
  8. vue({
  9. css: true, // Dynamically inject css as a <style> tag
  10. compileTemplate: true, // Explicitly convert template to render function
  11. }),
  12. // buble({
  13. // objectAssign: true,
  14. // transforms: {
  15. // asyncAwait: false,
  16. // forOf: false,
  17. // }
  18. // }), // Transpile to ES5
  19. babel({
  20. babelHelpers: 'runtime',
  21. exclude: 'node_modules/**'
  22. }),
  23. ],
  24. };

jsx 语法的支持

  1. <template>
  2. <div class="component my-component">
  3. <img :src="logoSrc" />
  4. <Title />
  5. </div>
  6. </template>
  7. <script>
  8. ...
  9. const Title = {
  10. name: "title",
  11. render() {
  12. return <span>标题</span>; // jsx 语法
  13. },
  14. };
  15. export default {
  16. components: { Title },
  17. ...
  18. };
  19. </script>

以上写法将导致打包出错:

关键报错信息:(plugin commonjs--resolver) RollupError: Expression expected

解决方法如下

安装 unplugin-vue-jsx 插件

npm i unplugin-vue-jsx -D

修改 rollup.config

  1. ...
  2. import VueJsx from 'unplugin-vue-jsx/rollup';
  3. ...
  4. export default {
  5. ...
  6. plugins: [
  7. commonjs({ exclude: 'src/**' }), // 需要排除掉包含 jsx 语法的文件,否则 VueJsx 无效,原因未知
  8. ...
  9. VueJsx({ version: 2 }),
  10. vue({
  11. css: true, // Dynamically inject css as a <style> tag
  12. compileTemplate: true, // Explicitly convert template to render function
  13. }),
  14. ...
  15. ],
  16. };

支持 TypeScript

如果本项目已配置为支持 TypeScript 的 Vue2 项目,则在打包时会报错

关键报错信息:Note that you need plugins to import files that are not JavaScript

解决方法如下

安装 rollup-plugin-typescript2 插件

npm i rollup-plugin-typescript2 -D

注:为什么不使用 @rollup/plugin-typescript ?请参考 vue.js - Error: Unexpected token (Note that you need plugins to import files that are not JavaScript) rollup vue package - Stack Overflow

修改 rollup.config

  1. ...
  2. import typescript2 from 'rollup-plugin-typescript2';
  3. ...
  4. export default {
  5. ...
  6. plugins: [
  7. typescript2({
  8. useTsconfigDeclarationDir: true,
  9. // tsconfigOverride: { // 是否覆盖 tsconfig.json 的设置
  10. // compilerOptions: {
  11. // declaration: false,
  12. // }
  13. // }
  14. }),
  15. commonjs({ exclude: 'src/**' }),
  16. ...
  17. ],
  18. };

如果希望输出类型说明文件(d.ts),则增加以下两步

修改 tsconfig.json

  1. {
  2. "compilerOptions": {
  3. ...
  4. "sourceMap": false,
  5. "declaration": true,
  6. "declarationDir": "dist/types",
  7. "baseUrl": ".",
  8. ...
  9. },
  10. ...
  11. }

修改 package.json

  1. {
  2. ...
  3. "license": "MIT",
  4. "main": "dist/my-component.umd.js",
  5. "module": "dist/my-component.esm.js",
  6. "unpkg": "dist/my-component.min.js",
  7. "types": "dist/types/main.d.ts",
  8. ...
  9. }

如果需要生成 source map,则如下配置

修改 tsconfig.json

  1. ...
  2. export default {
  3. ...
  4. output: {
  5. name: 'MyComponent',
  6. exports: 'named',
  7. sourcemap: true,
  8. },
  9. ...
  10. };

即在 output 中增加 sourcemap: true

tsconfig.json 中的配置项 sourceMap 最好也写成 "sourceMap": true,虽然在本案例中并不会形成实质区别


衍生问题解决

如下,按 ts 风格编写的 Vue 组件中,引入了 vue

  1. <script lang="ts">
  2. import Vue from "vue";
  3. ...
  4. export default Vue.extend({
  5. ...
  6. });
  7. </script>

打包时会报如下警告

关键警告信息:Unresolved dependencies

消除警告方法如下

安装 @rollup/plugin-node-resolve 插件

npm i @rollup/plugin-node-resolve -D

修改 rollup.config

  1. ...
  2. import resolve from '@rollup/plugin-node-resolve';
  3. ...
  4. export default {
  5. ...
  6. plugins: [
  7. ...
  8. scss({ insert: true }),
  9. image(),
  10. json(),
  11. resolve(),
  12. VueJsx({ version: 2 }),
  13. ...
  14. ],
  15. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/341024
推荐阅读
相关标签
  

闽ICP备14008679号